兩種快取淘汰演算法LFU LRU

2022-08-30 23:48:26 字數 1284 閱讀 3170

lru全稱是least recently used,即最近最久未使用的意思。

1.用乙個陣列來儲存資料,給每乙個資料項標記乙個訪問時間戳,每次插入新資料項的時候,先把陣列中存在的資料項的時間戳自增,並將新資料項的時間戳置為0並插入到陣列中。每次訪問陣列中的資料項的時候,將被訪問的資料項的時間戳置為0。當陣列空間已滿時,將時間戳最大的資料項淘汰。

2.利用乙個鍊錶來實現,每次新插入資料的時候將新資料插到鍊錶的頭部;每次快取命中(即資料被訪問),則將資料移到鍊錶頭部;那麼當鍊表滿的時候,就將鍊錶尾部的資料丟棄。

3.利用鍊錶和hashmap。當需要插入新的資料項的時候,如果新資料項在鍊錶中存在(一般稱為命中),則把該節點移到鍊錶頭部,如果不存在,則新建乙個節點,放到鍊錶頭部,若快取滿了,則把鍊錶最後乙個節點刪除即可。在訪問資料的時候,如果資料項在鍊錶中存在,則把該節點移到鍊錶頭部,否則返回-1。這樣一來在鍊錶尾部的節點就是最近最久未訪問的資料項。

對於第一種方法,需要不停地維護資料項的訪問時間戳,另外,在插入資料、刪除資料以及訪問資料時,時間複雜度都是o(n)。對於第二種方法,鍊錶在定位資料的時候時間複雜度為o(n)。所以在一般使用第三種方式來是實現lru演算法。

lfu(least frequently used)演算法根據資料的歷史訪問頻率來淘汰資料,其核心思想是「如果資料過去被訪問多次,那麼將來被訪問的頻率也更高」。

1. 新加入資料插入到佇列尾部(因為引用計數為1);

2. 佇列中的資料被訪問後,引用計數增加,佇列重新排序;

3. 當需要淘汰資料時,將已經排序的列表最後的資料塊刪除。

3. lru-k

3.1. 原理

lru-k中的k代表最近使用的次數,因此lru可以認為是lru-1。lru-k的主要目的是為了解決lru演算法「快取汙染」的問題,其核心思想是將「最近使用過1次」的判斷標準擴充套件為「最近使用過k次」。 

3.2. 實現 

相比lru,lru-k需要多維護乙個佇列,用於記錄所有快取資料被訪問的歷史。只有當資料的訪問次數達到k次的時候,才將資料放入快取。當需要淘汰資料時,lru-k會淘汰第k次訪問時間距當前時間最大的資料。

3.3. 分析

【命中率】

lru-k降低了「快取汙染」帶來的問題,命中率比lru要高。

【複雜度】

lru-k佇列是乙個優先順序佇列,演算法複雜度和代價比較高。

【代價】

由於lru-k還需要記錄那些被訪問過、但還沒有放入快取的物件,因此記憶體消耗會比lru要多;當資料量很大的時候,記憶體消耗會比較可觀。

lru-k需要基於時間進行排序(可以需要淘汰時再排序,也可以即時排序),cpu消耗比lru要高。

兩種常見的快取淘汰演算法LFU LRU

1.lfu 1.1.原理 lfu least frequently used 演算法根據資料的歷史訪問頻率來淘汰資料,其核心思想是 如果資料過去被訪問多次,那麼將來被訪問的頻率也更高 1.2.實現 lfu的每個資料塊都有乙個引用計數,所有資料塊按照引用計數排序,具有相同引用計數的資料塊則按照時間排序...

兩種常見的快取淘汰演算法LFU LRU

1.lfu 1.1.原理 lfu least frequently used 演算法根據資料的歷史訪問頻率來淘汰資料,其核心思想是 如果資料過去被訪問多次,那麼將來被訪問的頻率也更高 1.2.實現 lfu的每個資料塊都有乙個引用計數,所有資料塊按照引用計數排序,具有相同引用計數的資料塊則按照時間排序...

快取淘汰演算法

1.lru 1.1.原理 lru least recently used,最近最少使用 演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是 如果資料最近被訪問過,那麼將來被訪問的機率也更高 1.2.實現 最常見的實現是使用乙個鍊錶儲存快取資料,詳細演算法實現如下 1.新資料插入到鍊錶頭部 2....