lru(least recently used)就是將最近不被訪問的資料給淘汰掉,lru基於一種假設:認為最近使用過的資料將來被使用的概率也大,最近沒有被訪問的資料將來被使用的概率比較低。
lru一般通過鍊錶形式來存放快取資料,新插入或被訪問的資料放在鍊錶頭部,超過一定閾值後,自動淘汰鍊錶尾部的資料。下圖很形象的說明了lru快取淘汰過程。(來自網路)
步驟:1、新插入a, 將a放置在佇列頭部
2、新插入b, 將b放置在佇列頭部, a自動推舉次席。
3、新插入c, 將c放置在佇列頭部, b自動推舉次席。
4、新插入d, 將d放置在佇列頭部, c自動推舉次席。
5、新插入e, 將e放置在佇列頭部, d自動推舉次席。
6、新插入e, 將e放置在佇列頭部, 這時佇列長度大於閾值,自動將尾部資料a給淘汰掉
7、訪問資料c,然後將c重新放置在佇列頭部。
8、新插入e, 將e放置在佇列頭部, 這時佇列長度大於閾值,自動淘汰尾部資料b
/**上述**在博主本機測試驗證通過(單執行緒操作下)* 2018/4/11.
* * 使用鍊錶+hashmap來實現, 這裡沒有考慮併發情況, 所以在**中沒有使用鎖 */
public
class lrucache
}private hashmapcaches;
private
intmaxcapacity;
private
intcurrentcachesize;
/*** 頭結點, 頭結點不參與淘汰,只是作為標識鍊錶中的第乙個節點
*/private
cachenode head;
/*** 尾節點, 尾節點不參與淘汰, 只是作為標識鍊錶中最後乙個節點
*/private
cachenode tail;
public lrucache(int
maxcapacity)
public
void
put(k k, v v)
node = new
cachenode();
node.key =k;
currentcachesize ++;
}node.value =v;
movetofirst(node);
//lru策略, 新插入的元素放置到佇列頭部
caches.put(k, node);
}public
void
movetofirst(cachenode node)
public
void
removelast()
public
object get(k k)
object v =node.value;
movetofirst(node);
return
v; }
public
object remove(k k)
cachenode pre =node.before;
cachenode next =node.after;
pre.after =next;
next.before =pre;
caches.remove(k);
currentcachesize --;
return
node.value;}}
經典演算法面試題 LRU快取
設計和構建乙個 最近最少使用 快取,該快取會刪除最近最少使用的專案。快取應該從鍵對映到值 允許你插入和檢索特定鍵對應的值 並在初始化時指定最大容量。當快取被填滿時,它應該刪除最近最少使用的專案。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存...
面試題 16 25 LRU 快取
設計和構建乙個 最近最少使用 快取,該快取會刪除最近最少使用的專案。快取應該從鍵對映到值 允許你插入和檢索特定鍵對應的值 並在初始化時指定最大容量。當快取被填滿時,它應該刪除最近最少使用的專案。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存...
演算法面試題
1 兩個有序的陣列求中位數 時間複雜度o log n m 這個演算法有一定的缺陷,僅做參考 2 如何解決hash衝突 3 調整陣列順序使奇數字於偶數前面 void reorderoddeven int pdata,unsigned int length 4 鍊錶中倒數第k個節點 listnode f...