Java基礎 第三節 第十課

我是小白呀發表於2020-11-29

概述

當你用著 Java 裡面的容器類一把一把的掉頭髮的時候, 你有沒有想過, 怎麼 ArrayList 就像一個無限擴充的陣列, 也好像連結串列之類的. 這就是資料結構的用處, 只不過你在不知不覺中使用了.

現實世界的儲存, 我們使用的工具和建模. 每種資料結構有自己的優點和缺點, 想想如果蒼老師的資料是用陣列儲存, 我們還能方便的查詢到所需要的資料嗎? 而演算法, 在這麼多的資料中如何做到最快的插入, 查詢, 刪除, 也是在追求更快.

我們 Java 是物件導向的語言, 就好似自動檔轎車, C 語言好似手動擋吉普. 那麼資料結構就是變速箱的工作原理. 你可以完全不知道變速箱怎麼工作, 就把自動擋的車子從 A 點開到 B 點, 而未必就比懂的人慢. 寫程式這件事和開車一樣, 經驗可以起到很大的作用. 如果你不知道底層是怎麼工作的, 就永遠只能開車而不會修車, 也不能造車. 當然了, 資料結構的內容不叫多, 系統的學習也是相對費功夫的. 我們常見的資料結構: 堆疊, 佇列, 陣列, 連結串列和紅黑樹. 今天我來給大家介紹一下, 作為資料結構的入門, 瞭解一下它們的特點即可. ( 詳細的資料結構教程可以參閱我寫的 <Python 資料結構>)
在這裡插入圖片描述

常見的資料結構

資料儲存的常用結構有: 棧, 佇列, 陣列, 連結串列和紅黑樹. 我們分別來了解一下:

棧 (stack): 又稱堆疊, 它是運算受限的線性代表. 其限制是僅允許在表的一端進行插入和刪除操作, 不允許在其他任何位置進行新增, 查詢, 刪除等操作.

採用該結構的集合, 對元素的存取有如下的特點:

  • 先進後出 (即, 存進去的元素, 要在它後面的元素依次取出後, 才能取出該元素) 例如, 子彈壓進彈夾, 先壓進去的子彈在下面, 後壓進去的子彈在上面. 當開槍時, 先彈出上面的子彈, 然後才能彈出下面的子彈
  • 棧的入口, 出口都是棧的頂端位置
    在這裡插入圖片描述

這裡兩個名詞需要注意:

  • 壓棧: 就是儲存元素. 即把元素儲存到棧頂端位置. 棧中已有的元素依次向棧底方向移動一個位置
  • 壓棧: 就是提取元素. 即把棧的頂端位置元素取出, 棧中已有的元素依次向棧頂方向移動一個位置

佇列

佇列 (quene): 簡稱隊, 它同棧一樣, 元素一種運算受限的線性表. 其限制是僅允許在表的一端進行插入, 而在表的另一端進行刪除.

採用該結構的集合, 對元素的存取有如下的特點:

  • 先進先出 (即存進去的元素, 要在它前面的元素依次取出後, 才能取出該元素). 例如, 小火車過山進洞, 車頭先進去, 車尾後進去; 車頭先處理, 車尾後出來.
  • 佇列的入口, 出口各在一側. 例如, 下圖的左側為入口, 右側為出口.
    在這裡插入圖片描述

陣列

陣列 (Array): 是有序的元素序列, 陣列是在記憶體中開闢一段連續的空間, 並在此空間存放元素. 就像是一排出租屋, 有 100 個房間, 從 001 到 100 每個房間都有固定的編號, 通過便後就可以快速找到租房子的人.

採用這種資料結構的集合, 對元素的存取有如下的特點:

  • 查詢元素快: 通過索引, 可以快速訪問指定位置的元素
    在這裡插入圖片描述
  • 指定索引位置增加元素: 需要建立一個新陣列, 將指定新元素儲存在指定索引位置, 再把原陣列元素根據索引, 複製到新陣列所對應索引的位置. 如下圖:
    在這裡插入圖片描述
  • 指定位置刪除元素: 需要建立一個新陣列, 把原陣列元素根據索引, 複製到新陣列對應索引的位置, 元素中指定索引位置元素不復制到新陣列中. 如下圖:
    在這裡插入圖片描述

連結串列

連結串列 (linked list): 由一系列節點 (node: 連結串列中每一個元素稱為節點) 組成, 節點可以在執行時動態生成. 每個節點包括兩個部分: 一個是儲存資料元素的資料域, 另一個是儲存下一個節點地址的指標域. 我們常說的連結串列結構有單向連結串列與雙向連結串列, 那麼這裡給大家介紹的是單向連結串列.
在這裡插入圖片描述

採用該結構的集合, 對元素的存取有如下的特點:

  • 多個節點之間, 通過地址進行連線. 例如, 多個人手拉手, 每個人使用自己的右手拉住下個人的左手, 以此類推, 這樣多個人就連在一起了.
    在這裡插入圖片描述
  • 查詢元素慢: 想要查詢某個元素, 需要通過連線的節點, 依次向後查詢指定元素
  • 增加元素快: 只需要修改連線下個元素的地址即可
    在這裡插入圖片描述
  • 刪除元素快: 只需要修改連線下個元素的地址即可
    在這裡插入圖片描述

紅黑樹

二叉樹 (binary tree): 是每個節點不超過 2 的有序樹. (tree)

簡單的理解, 就是一種類似於我們生活中樹的結構, 只不過每個節點上都最多能有兩個子節點.

二叉樹是每個節點最多有兩個子樹的結構. 頂上的叫根節點, 兩邊被稱作 “左子樹” 和 “右子樹”. 如圖:
在這裡插入圖片描述
我們要說的二叉樹的一種比較有意思的叫做紅黑樹. 紅黑樹本身就是一顆二叉樹, 將節點插入後, 該樹任然是一顆二叉樹. 這就意味著, 樹的減值任然是有序的.

紅黑樹的約束:

  1. 節點可以是紅色或者黑色的
  2. 根節點是黑色的
  3. 葉子節點 (特指空節點) 是黑色的
  4. 每個紅色節點的子節點都是黑色的
  5. 任何一個節點到其每一個葉子節點的所有路徑上黑色節點數相同
    紅黑樹的特點:
    速度特別快, 趨近於平衡樹, 查詢葉子元素最少和最多次數不多於二倍.
    在這裡插入圖片描述

相關文章