塊狀鏈表(塊狀數組)
數組與鏈表
在討論塊狀鏈表(或者稱塊狀數組)之前,我們先回顧一下數組和鏈表的特點:
操作 | 數組 (通常考慮有序) | 鏈表 |
---|---|---|
存儲結構 | 地址連續的存儲單元,物理位置相鄰 | 地址不連續,物理位置不相鄰 |
定位 | O (1) | O (N) |
插入 | O (N) | O (1) |
刪除 | O (N) | O (1) |
數組定位的效率很高,直接通過下標索引就能獲取元素的定位,由於長度通常是固定的,因此不適合插入和刪除等操作。當數組爲有序時,使用二分查找法效率較高,時間複雜度爲 O (logN)。
鏈表的插入和刪除效率較高,但定位效率較低,最差情況需要遍歷整個鏈表才能定位到目標節點元素。
塊狀數組
假設一個數據可以用一個大數組進行存儲,當我們按照某個間距把這個大數組劃分成若干個小數組,這個的結構我們稱之爲塊狀數組。
當每一個小數組作爲節點存儲到一個鏈表中時,這樣的結構就能成爲塊狀鏈表。實際上,兩者的宏觀邏輯是一致的。
塊狀鏈表
塊狀鏈表結合了數組和鏈表的優點,使得所有操作的時間複雜度都爲 O ()。
從結構設計上看,塊狀鏈表實際上是個鏈表,但鏈表中每個節點又是一個數組。在處理實際問題時,我們可以先確定操作對象位於哪個區間,即位於哪個小數組中,而不用通過遍歷每一個元素來定位目標對象,從而提升效率。
定位
從鏈表頭節點開始遍歷,根據某些條件(如邊界值、特徵值等)定位某一個節點(塊、數組),再遍歷節點內數組,確定偏移量。
隨後即可進行查詢、插入、刪除等操作。
複雜度分析
假設數據總數爲 N,數組的長度固定爲 n,那麼在理想狀況下劃分的塊數目爲 N/n,那麼
- 定位的時間複雜度爲 O (N/n);
- 插入、刪除的時間複雜度爲 O (n)。
令 N/n = n,則 n = ,即每次操作的時間複雜度約爲 O ()。
與平衡樹相比較:時間複雜度較大,空間複雜度較小。
平衡樹 | 塊狀鏈表 | |
---|---|---|
時間複雜度 | O (logN) | O () |
空間複雜度 | O (N) | O () |