1. 程式人生 > >如何實現LRU淘汰緩衝演算法

如何實現LRU淘汰緩衝演算法

  1. 緩衝淘汰策略:指快取被用滿時清理資料的優先順序

    • 先進先出策略(FIFO:First in,First out)
    • 最少使用策略(LFU:Least Frequently Used )
    • 最近最少使用策略(LRU:Least Recently Used)
  2. 連結串列:通過‘指標’將一組零散的記憶體塊串聯起來使用。適合插入、刪除操作頻繁的場景,查詢時間複雜度較高。

  3. 連結串列分類

    • 單鏈表
    • 迴圈連結串列
    • 雙向連結串列
    • 雙向迴圈連結串列
  4. 記錄下個節點地址的指標叫做後繼指標next

  5. 單鏈表:頭結點用來記錄連結串列的基地址,尾節點指向一個空地址NULL,表示連結串列最後一個節點。

  6. 迴圈連結串列:尾結點指向連結串列的頭結點

  7. 雙向連結串列:每個結點包含後繼指標與前驅指標

  8. 思想:

    • 空間換時間(比如緩衝操作):對於執行較慢的程式,通過消耗更多的記憶體來進行優化。
    • 時間換空間(程式碼跑在手機或者微控制器上):消耗過多記憶體的程式,通過消耗更多的時間來降低記憶體的消耗。
  9. 連結串列與陣列效能比拼

時間複雜度 陣列 連結串列
插入、刪除 O(n) O(1)
隨機訪問 O(1) O(n)
  1. 什麼是快取

緩衝是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非廣泛的應用,比如常見的 CPU 緩衝、資料庫緩衝、瀏覽器緩衝

  1. 為什麼使用快取?即快取的特點

緩衝的大小是有限的,當快取被用滿時,哪些資料應該被清理出去,哪些資料應該被保留?就需要用到快取淘汰策略

(如第 1 點)

  1. 連結串列實現 LRU 快取淘汰策略

當訪問的資料沒有儲存在快取的連結串列中時,直接將資料插入連結串列表頭,時間複雜度為O(1);當訪問的資料存在於儲存的連結串列中時,將該資料對應的節點,插入到連結串列表頭,時間複雜度為O(n)。如果快取被佔滿,則從連結串列尾部的資料開始清理,時間複雜度為O(1)。

  1. 陣列實現 LRU 快取淘汰策略
  • 方式一:首位置儲存最新訪問資料,末尾位置優先清理

當訪問的資料未存在於快取的陣列中時,直接將資料插入陣列第一個元素位置,此時陣列所有元素需要向後移動1個位置,時間複雜度為O(n);當訪問的資料存在於快取的陣列中時,查詢到資料並將其插入陣列的第一個位置,此時亦需移動陣列元素,時間複雜度為O(n)。快取用滿時,則清理掉末尾的資料,時間複雜度為O(1)。

  • 方式二:首位置優先清理,末尾位置儲存最新訪問資料

當訪問的資料未存在於快取的陣列中時,直接將資料新增進陣列作為當前最有一個元素時間複雜度為O(1);當訪問的資料存在於快取的陣列中時,查詢到資料並將其插入當前陣列最後一個元素的位置,此時亦需移動陣列元素,時間複雜度為O(n)。快取用滿時,則清理掉陣列首位置的元素,且剩餘陣列元素需整體前移一位,時間複雜度為O(n)。(優化:清理的時候可以考慮一次性清理一定數量,從而降低清理次數,提高效能。)