LRU是Least Recently Used的縮寫,即最近最少使用,是一種經常使用的頁面置換算法,選擇最近最久未使用的頁面予以淘汰。該算法賦予每一個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間 t,當須淘汰一個頁面時,選擇現有頁面中其 t 值最大的,即最近最少使用的頁面予以淘汰。html
LRU正如咱們平常生活時使用手機那樣子:咱們會打開多個應用,在後臺應用管理能夠看到你打開的應用列表,最近的開的排的靠前,比較舊的沒用就靠的比較後了。但是,要知道,咱們的手機內存是有限的,若是開太多應用,把內存都佔滿,那麼手機就特別卡了。因此,在這時候,手機會自動清理內存,過程以下:會將最久未使用的應用程序進程中止(斷定爲無用的數據),就是按照時間來,而後停掉倒數第二久未使用的應用......以此類推,直到有足夠空間才中止清理。若是你又去訪問未中止的應用,那麼他就跳到了咱們後臺應用列表的第一個了。算法
LRU算法就是這樣的,將最久、最少使用的數據進行淘汰。緩存
若是叫咱們設計一個LRU算法如何設計呢?spa
要接受一個最大的緩存容量 capacity設計
實現兩個方法:code
使用雙向鏈表和哈希表的結合實現LRU算法: 哈希表的查找速度快,可是是無序的; 而鏈表是有序的, 可是查找速度慢, 爲\(O(N)\), 因此咱們能夠利用這兩個特性,結合起來,造成了哈希鏈表, 這樣的話,get和put都是\(O(1)\)的時間複雜度了, 圖解以下:htm