1. 程式人生 > >順序表(陣列)與連結串列的區別

順序表(陣列)與連結串列的區別

相關文件

演算法和資料結構系列

學習演算法和資料結構:線性結構

順序表

順序表一般視為陣列,使用一組地址連續的儲存單元依次儲存資料元素

順序表具有以下特點:

  1. 長度固定,必須在記憶體分配之前確定陣列長度;
  2. 儲存空間連續,即允許隨機訪問任意元素;
  3. 資料儲存密集,即在記憶體中儲存的全部是資料;
  4. 要訪問特定元素,使用元素索引(時間複雜度為O(1));
  5. 要插入或刪除特定元素,需要移動該位置之後的所有元素(時間複雜度為O(n))

可以考慮使用“複製-倍增”的方法利用“順序表”做一個“變長陣列”(這樣做勢必會產生“記憶體碎片”,不環保但是方便元素的查詢)

連結串列

連結串列中的每個結點都有一個“指向下一個結點的指標”
根據指標的數量和指向,可以分為“單鏈表”、“雙鏈表”、“迴圈連結串列”

連結串列具有以下特點:

  1. 長度不固定,可以任意增刪;
  2. 儲存空間不連續,以單鏈表為例每個元素只能訪問相鄰的一個元素;
  3. 資料儲存密度小,降低了整體的關聯性;
  4. 要訪問特定元素,必須從表頭開始遍歷所有元素(時間複雜度為O(n));
  5. 要插入或刪除特定元素,不涉及其它元素的變動

在實際操作中,連結串列由於要頻繁的分配小塊記憶體而分配記憶體是要耗時的所以真正執行起來往往連結串列不是那麼優秀

雙向迴圈連結串列
雙向迴圈連結串列的每一個元素都有一個後繼結點next、一個前趨結點prev,第一個元素的前趨結點指向最後一個元素,而最後一個元素的後繼結點指向第一個元素

靜態連結串列
所謂的靜態連結串列就是在用陣列建立連結串列並用一個下標來維護,類似於“記憶體池”預先分配一個足夠長的陣列,之後連結串列節點都會儲存在這個數組裡,“靜態連結串列”解決了“普通連結串列”需要頻繁記憶體分配的問題(不過需要實現準備一個足夠大的陣列,或者考慮變長陣列)

這種描述方法便於在沒有指標型別的高階程式設計語言中使用連結串列結構

這種儲存結構,仍需要預先分配一個較大的空間,但在作為線性表的插入和刪除操作時不需移動元素,僅需修改指標,仍具有鏈式儲存結構的主要優點

靜態連結串列的每一個節點都包含兩部分,分別是資料data和遊標cur(遊標是指該儲存元素的下一個元素所在陣列對應的標)

塊狀連結串列
也叫“隨機線性存取表”,整體上使用連結串列,但是連結串列的每一個節點替換成一個大小合適的陣列

塊狀連結串列結合了順序表(陣列)快速查詢和連結串列新增、刪除元素快速的特點

跳躍連結串列
也稱“跳錶”,是一種隨機化的資料結構

要查詢一個目標元素,如上圖所示,起步於頭元素和頂層列表,並沿著每個連結串列搜尋,直到到達小於或著等於目標的最後一個元素

“跳錶”的資料存取效率很高(可以比擬“二叉查詢樹”,大多數查詢僅需要O(logn)的時間複雜度)

跳躍連結串列的思路:
在構造此連結串列的時候,我們構造了另一個連結串列,它指向原連結串列中的元素,只不過它中間跳過一些節點,但任然是按照原連結串列順序將其中元素串起來,這樣在查詢過程中可以跳過一些節點;跳錶的產生就是為了更高效的查詢資料

跳躍連結串列的一般構造套路:

  1. 給定一個有序連結串列;
  2. 選擇其中最大和最小的元素,然後從剩下的元素中隨機選出一些組成一個有序連結串列,這是跳錶的第一層,原連結串列稱為其下一層;
  3. 為剛剛選出的每個元素新增一個指標域,該指標指向下一層中和自己相同值的元素;Top指標指向首元素
  4. 重複2、3步,直到不能找出除了最大最小值的其它數

“跳錶”就是為了高效查詢資料而誕生的!