資料結構與算法系列4--連結串列
什麼是連結串列?
1.和陣列一樣,連結串列也是一種線性表。 2.從記憶體結構來看,連結串列的記憶體結構是不連續的記憶體空間,是將一組零散的記憶體塊串聯起來,從而進行資料儲存的資料結構。 3.連結串列中的每一個記憶體塊被稱為節點Node。節點除了儲存資料外,還需記錄鏈上下一個節點的地址,即後繼指標next。
常用連結串列:
1.單鏈表 1)每個節點只包含一個指標,即後繼指標。 2)單鏈表有兩個特殊的節點,即首節點和尾節點。為什麼特殊?用首節點地址表示整條連結串列,尾節點的後繼指標指向空地址null。 3)效能特點:插入和刪除節點的時間複雜度為O(1),查詢的時間複雜度為O(n)。 2.迴圈連結串列
連結串列的特點
1.插入、刪除資料效率高O(1)級別(只需更改指標指向即可),隨機訪問效率低O(n)級別(需要從鏈頭至鏈尾進行遍歷)。 2.和陣列相比,記憶體空間消耗更大,因為每個儲存資料的節點都需要額外的空間儲存後繼指標。
連結串列和陣列比較?
陣列:插入、刪除的時間複雜度是O(n),隨機訪問的時間複雜度是O(1)。 連結串列:插入、刪除的時間複雜度是O(1),隨機訪問的時間複雜端是O(n)。 陣列缺點: 1)若申請記憶體空間很大,比如100M,但若記憶體空間沒有100M的連續空間時,則會申請失敗,儘管記憶體可用空間超過100M。 2)大小固定,若儲存空間不足,需進行擴容,一旦擴容就要進行資料複製,而這時非常費時的。 連結串列缺點
應用(實現LRU緩衝淘汰策略)
1)什麼是快取? 快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。 2)為什麼使用快取?即快取的特點 快取的大小是有限的,當快取被用滿時,哪些資料應該被清理出去,哪些資料應該被保留?就需要用到快取淘汰策略。 3)什麼是快取淘汰策略? 指的是當快取被用滿時清理資料的優先順序。 4)有哪些快取淘汰策略? 常見的3種包括先進先出策略FIFO(First In,First Out)、最少使用策略LFU(Least Frenquently Used)、最近最少使用策略LRU(Least Recently Used)。 5)連結串列實現LRU快取淘汰策略? 當訪問的資料存在於儲存的連結串列中時,將該資料對應的節點,插入到連結串列表頭,時間複雜度為O(n)。如果快取被佔滿,則從連結串列尾部的資料開始清理,時間複雜度為O(1)。
設計思想
時空替換思想:“用空間換時間” 與 “用時間換空間” 當記憶體空間充足的時候,如果我們更加追求程式碼的執行速度,我們就可以選擇空間複雜度相對較高,時間複雜度小相對較低的演算法和資料結構,快取就是空間換時間的例子。如果記憶體比較緊缺,比如程式碼跑在手機或者微控制器上,這時,就要反過來用時間換空間的思路。