如何實現LRU淘汰緩衝演算法
-
緩衝淘汰策略:指快取被用滿時清理資料的優先順序
- 先進先出策略(FIFO:First in,First out)
- 最少使用策略(LFU:Least Frequently Used )
- 最近最少使用策略(LRU:Least Recently Used)
-
連結串列:通過‘指標’將一組零散的記憶體塊串聯起來使用。適合插入、刪除操作頻繁的場景,查詢時間複雜度較高。
-
連結串列分類
- 單鏈表
- 迴圈連結串列
- 雙向連結串列
- 雙向迴圈連結串列
-
記錄下個節點地址的指標叫做後繼指標next
-
單鏈表:頭結點用來記錄連結串列的基地址,尾節點指向一個空地址NULL,表示連結串列最後一個節點。
-
迴圈連結串列:尾結點指向連結串列的頭結點
-
雙向連結串列:每個結點包含後繼指標與前驅指標
-
思想:
- 空間換時間(比如緩衝操作):對於執行較慢的程式,通過消耗更多的記憶體來進行優化。
- 時間換空間(程式碼跑在手機或者微控制器上):消耗過多記憶體的程式,通過消耗更多的時間來降低記憶體的消耗。
-
連結串列與陣列效能比拼
時間複雜度 | 陣列 | 連結串列 |
---|---|---|
插入、刪除 | O(n) | O(1) |
隨機訪問 | O(1) | O(n) |
- 什麼是快取
緩衝是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非廣泛的應用,比如常見的 CPU 緩衝、資料庫緩衝、瀏覽器緩衝
- 為什麼使用快取?即快取的特點
緩衝的大小是有限的,當快取被用滿時,哪些資料應該被清理出去,哪些資料應該被保留?就需要用到快取淘汰策略
(如第 1 點)
- 連結串列實現 LRU 快取淘汰策略
當訪問的資料沒有儲存在快取的連結串列中時,直接將資料插入連結串列表頭,時間複雜度為O(1);當訪問的資料存在於儲存的連結串列中時,將該資料對應的節點,插入到連結串列表頭,時間複雜度為O(n)。如果快取被佔滿,則從連結串列尾部的資料開始清理,時間複雜度為O(1)。
- 陣列實現 LRU 快取淘汰策略
- 方式一:首位置儲存最新訪問資料,末尾位置優先清理
當訪問的資料未存在於快取的陣列中時,直接將資料插入陣列第一個元素位置,此時陣列所有元素需要向後移動1個位置,時間複雜度為O(n);當訪問的資料存在於快取的陣列中時,查詢到資料並將其插入陣列的第一個位置,此時亦需移動陣列元素,時間複雜度為O(n)。快取用滿時,則清理掉末尾的資料,時間複雜度為O(1)。
- 方式二:首位置優先清理,末尾位置儲存最新訪問資料
當訪問的資料未存在於快取的陣列中時,直接將資料新增進陣列作為當前最有一個元素時間複雜度為O(1);當訪問的資料存在於快取的陣列中時,查詢到資料並將其插入當前陣列最後一個元素的位置,此時亦需移動陣列元素,時間複雜度為O(n)。快取用滿時,則清理掉陣列首位置的元素,且剩餘陣列元素需整體前移一位,時間複雜度為O(n)。(優化:清理的時候可以考慮一次性清理一定數量,從而降低清理次數,提高效能。)