資料結構與演算法整理總結---陣列,連結串列

lxzoliver發表於2020-01-22

陣列

線性表概念

線性表(Linear List)。顧名思義,線性表就是資料排成像一條線一樣的結構。每個線性表上的資料最多隻有前和後兩個方向。其實除了陣列,連結串列、佇列、棧等也是線性表結構。

資料結構與演算法整理總結---陣列

非線性表概念

而與它相對立的概念是非線性表,比如二叉樹、堆、圖等。之所以叫非線性,是因為,在非線性表中,資料之間並不是簡單的前後關係

資料結構與演算法整理總結---陣列

陣列(Array)是一種線性表資料結構。它用一組連續的記憶體空間,來儲存一組具有相同型別的資料。也正因為陣列是線性表結構且是連續的記憶體空間和相同型別的資料兩個特點,所以支援隨機訪問

但有利就有弊,這兩個特點也讓陣列的很多操作變得非常低效,比如要想在陣列中刪除、插入一個資料,為了保證連續性,就需要做大量的資料搬移工作。插入、刪除操作也因此變得比較低效,平均情況時間複雜度為O(n)。

連結串列

相比陣列,連結串列是一種稍微複雜一點的資料結構。它並不需要一塊連續的記憶體空間,它通過“指標”將一組零散的記憶體塊串聯起來使用

連結串列結構五花八⻔,主要介紹三種最常⻅的連結串列結構,它們分別是:單連結串列、雙向連結串列和迴圈連結串列。

單連結串列

連結串列通過指標將一組零散的記憶體塊串聯在一起。其中,我們把記憶體塊稱為連結串列的“結點”。為了將所有的結點串 起來,每個連結串列的結點除了儲存資料之外,還需要記錄鏈上的下一個結點的地址。如圖所示,我們把這個記錄下個結點地址的 指標叫作後繼指標next。

資料結構與演算法整理總結---陣列,連結串列

從單連結串列圖中,你應該可以發現,其中有兩個結點是比較特殊的,它們分別是第一個結點和最後一個結點。我們習慣性地把第一個結點叫作頭結點,把最後一個結點叫作尾結點。其中,頭結點用來記錄連結串列的基地址。有了它,我們就可以遍歷得到整條連結串列。而尾結點特殊的地方是:指標不是指向下一個結點,而是指向一個空地址NULL,表示這是連結串列上最後一個結點。

與陣列一樣,連結串列也支援資料的查詢、插入和刪除操作。在連結串列中插入或者刪除一個資料,我們並不需要為了保持記憶體的連續性而搬移結點,因為連結串列的儲存空間本身就不是連續的。所以,在連結串列中插入和刪除一個資料是非常快速的。

資料結構與演算法整理總結---陣列,連結串列

但是,有利就有弊。連結串列要想隨機訪問第k個元素,就沒有陣列那麼高效了。因為連結串列中的資料並非連續儲存的,所以無法像陣列那樣,根據首地址和下標,通過定址公式就能直接計算出對應的記憶體地址,而是需要根據指標一個結點一個結點地依次遍歷,直到找到相應的結點。

連結串列隨機訪問的效能沒有陣列好,需要O(n)的時間複雜度。

迴圈連結串列

迴圈連結串列是一種特殊的單連結串列。實際上,迴圈連結串列也很簡單。它跟單連結串列唯一的區別就在尾結點。我們知道,單連結串列的尾結點指標指向空地址,表示這就是最後的結點了。而迴圈連結串列的尾結點指標是指向連結串列的頭結點。從迴圈連結串列圖中,可以看出來,它像一個環一樣首尾相連,所以叫作“迴圈”連結串列。

資料結構與演算法整理總結---陣列,連結串列

雙向連結串列

單向連結串列只有一個方向,結點只有一個後繼指標next指向後面的結點。而雙向連結串列,顧名思義,它支援兩個方向,每個結點不 止有一個後繼指標next指向後面的結點,還有一個前驅指標prev指向前面的結點。

資料結構與演算法整理總結---陣列,連結串列

從圖中可以看出來,雙向連結串列需要額外的兩個空間來儲存後繼結點和前驅結點的地址。所以,如果儲存同樣多的資料, 雙向連結串列要比單連結串列佔用更多的記憶體空間。雖然兩個指標比較浪費儲存空間,但可以支援雙向遍歷,這樣也帶來了雙向連結串列操作的靈活性。

從結構上來看,雙向連結串列可以支援O(1)時間複雜度的情況下找到前驅結點,正是這樣的特點,也使雙向連結串列在某些情況下的插入、刪除等操作都要比單連結串列簡單、高效。

陣列,連結串列比較

資料結構與演算法整理總結---陣列,連結串列

陣列簡單易用,在實現上使用的是連續的記憶體空間,可以藉助CPU的快取機制,預讀陣列中的資料,所以訪問效率更高。而連結串列在記憶體中並不是連續儲存,所以對CPU快取不友好,沒辦法有效預讀。

陣列的缺點是大小固定,一經宣告就要佔用整塊連續記憶體空間。如果宣告的陣列過大,系統可能沒有足夠的連續記憶體空間分配給它,導致“記憶體不足(out of memory)”。如果宣告的陣列過小,則可能出現不夠用的情況。這時只能再申請一個更大的記憶體空間,把原陣列拷⻉進去,非常費時。連結串列本身沒有大小的限制,天然地支援動態擴容,我覺得這也是它與陣列最大的區別。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章