什麼是鏈結串列

每個元素持有值與指向下一個元素位置的指標,並沿著指標串接起來的資料結構。已知位置時,插入與刪除只需改接指標,為 O(1);但要讀取第 i 個元素必須從開頭走訪,需要 O(n)。元素容易散落在記憶體各處,快取效果不如陣列。

日文名稱: 連結リスト

「鏈結串列」出現在5領域的10道練習題中(資料結構與演算法, 記憶體階層與效能, 程式設計基礎(虛擬碼追蹤)等)。

這個名詞所屬的領域: 資料結構與演算法

練習鏈結串列的題目

與陣列相比,鏈結串列(各元素持有指向下一個元素位置之指標的串列)的特徵,下列何者正確?

  1. A若已知插入位置的前一個元素,只要改接指標就能插入,不必移動其他元素;但要讀取第 i 個元素,必須從開頭依序走訪
  2. B可以計算出第 i 個元素的位置,因此任何元素都能以固定時間 O(1) 讀取
  3. C元素在記憶體中緊密連續排列,因此依序讀取時快取與預取容易發揮效果
查看答案與解析

正確答案:A. 若已知插入位置的前一個元素,只要改接指標就能插入,不必移動其他元素;但要讀取第 i 個元素,必須從開頭依序走訪

在鏈結串列中,只要知道插入或刪除的位置,改寫前後的指標即可,只需 O(1)。另一方面,要讀取第 i 個元素必須從開頭追蹤 i 次指標,需要 O(n)。陣列可由起始位址與元素大小算出第 i 個元素的位址,因此能以 O(1) 讀取,但在中間插入時需要把後面的元素往後挪,要花 O(n)。此外,陣列的元素連續排列,快取與預取容易發揮效果;鏈結串列的節點容易散落在記憶體各處,即使同樣是 O(n) 的走訪,也可能慢上許多。

比較處理雜湊表碰撞的鏈結法(以鏈結串列串接相同位置的元素)與開放定址法(在表中尋找其他空位置),下列說明何者正確?負載因子為存放的元素數除以表的大小所得的值。

  1. A鏈結法在負載因子超過1時也能存放,但開放定址法無法存放超過表大小的元素,且負載因子接近1時搜尋次數會急遽增加
  2. B開放定址法不會發生碰撞,因此無論負載因子為何,搜尋都只需1次
  3. C鏈結法無論負載因子多高,搜尋的工作量都不變
查看答案與解析

正確答案:A. 鏈結法在負載因子超過1時也能存放,但開放定址法無法存放超過表大小的元素,且負載因子接近1時搜尋次數會急遽增加

鏈結法把相同位置的元素串成串列,因此元素數超過表的大小也能存放,但串列的平均長度與負載因子成正比增加,搜尋的工作量也隨之增加。開放定址法只存放在表中,元素數最多只能到表的大小,負載因子接近1時尋找空位的次數會急遽增加。無論哪種方法,負載因子超過設定值(例如約0.5~0.75)時,通常都會放大表格並重新放入所有元素(重新雜湊)。開放定址法也會發生碰撞,是靠尋找空位置來處理。

解析中的「鏈結串列」

出現「鏈結串列」的題目(10題)

  1. 走訪上述鏈結串列的處理,比讀取相同元素數量的陣列容易大幅變慢,其原因為下列何者?
  2. 與陣列相比,鏈結串列(各元素持有指向下一個元素位置之指標的串列)的特徵,下列何者正確?
  3. 比較處理雜湊表碰撞的鏈結法(以鏈結串列串接相同位置的元素)與開放定址法(在表中尋找其他空位置),下列說明何者正確?負載因子為存放的元素數除以表的大小所得的值。
  4. 在元素很多、負載因子維持在0.5左右的雜湊表中,使用線性探測的開放定址法往往比鏈結法(以鏈結串列串接的方法)快,最適當的原因為下列何者?
  5. 下列程式從元素編號1的元素開始,依序走訪以陣列 next 連接元素的鏈結串列並輸出。陣列的元素編號從1開始。next 的值0表示串列的結尾。輸出的值的順序為下列何者?
  6. 下列程式在以陣列 next 連接的鏈結串列 A → C → E → D → B 中,把 val[6] 的「F」插入到「C」(元素編號3)的正後方,再從元素編號1的元素開始依序走訪並輸出。陣列的元素編號從1開始。next 的值0表示串列的結尾。為使輸出為 A, C, F, E, D, B,【a】應填入下列何者?
  7. 硬體預取特別容易發揮效果的存取為下列何者?
  8. 關於使用CAS的無鎖資料結構中會出現的ABA問題,下列說明何者正確?
  9. 下列何者是在GPU上執行時容易效率不佳的處理?
  10. 對空的二元搜尋樹依序插入 1, 2, 3, …, 1000(不做平衡的操作)。在這棵樹中尋找1000時,從根部開始比較,到找到為止要比較幾個節點?

半導體、電子電路與資訊計算工具

相關名詞

陣列 預取 雜湊表 快取行 時間複雜度(大O符號) ABA 問題(ABA problem) LR/SC(載入保留/條件式儲存) GPU 二元搜尋樹 二元堆積

前往名詞解釋列表