LRU緩存算法(Java實(shí)現(xiàn))

LRU是Least Recently Used的縮寫(xiě)德迹,即最近最久未使用知染,常用于頁(yè)面置換算法烈掠,是為虛擬頁(yè)式存儲(chǔ)管理服務(wù)的。

LRU算法的提出来候,是基于這樣一個(gè)事實(shí):在前面幾條指令中使用頻繁的頁(yè)面很可能在后面的幾條指令中頻繁使用跷叉。反過(guò)來(lái)說(shuō),已經(jīng)很久沒(méi)有使用的頁(yè)面很可能在未來(lái)較長(zhǎng)的一段時(shí)間內(nèi)不會(huì)被用到。

設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)最近最少使用(LRU)緩存的數(shù)據(jù)結(jié)構(gòu)云挟,它應(yīng)該支持以下操作:get和set梆砸。
get(key)——如果鍵存在于緩存中,則獲得鍵值(總是正數(shù))园欣,否則返回-1帖世。
set(key, value)——如果鍵不存在,則設(shè)置或插入值俊庇。當(dāng)緩存達(dá)到其容量時(shí),應(yīng)在插入新項(xiàng)之前使最近最少使用的項(xiàng)無(wú)效鸡挠。

分析:LRU緩存可使用一個(gè)HashMap和雙向鏈表實(shí)現(xiàn)辉饱。HashMap,使得get的時(shí)間是O(1)拣展;雙向鏈表使節(jié)點(diǎn)添加/刪除操作O(1)彭沼。

定義雙向鏈表的節(jié)點(diǎn):

class Node{
    int key;
    int value;
    Node pre;
    Node next;
 
    public Node(int key, int value){
        this.key = key;
        this.value = value;
    }
}
public class LRUCache {
    int capacity;
    HashMap<Integer, Node> map = new HashMap<Integer, Node>();
    Node head=null;
    Node end=null;
 
    public LRUCache(int capacity) {
        this.capacity = capacity;
    }
 
    public int get(int key) {
        if(map.containsKey(key)){
            Node n = map.get(key);
            remove(n);
            setHead(n);
            return n.value;
        }
 
        return -1;
    }
 
    public void remove(Node n){
        if(n.pre!=null){
            n.pre.next = n.next;
        }else{
            head = n.next;
        }
 
        if(n.next!=null){
            n.next.pre = n.pre;
        }else{
            end = n.pre;
        }
 
    }
 
    public void setHead(Node n){
        n.next = head;
        n.pre = null;
 
        if(head!=null)
            head.pre = n;
 
        head = n;
 
        if(end ==null)
            end = head;
    }
 
    public void set(int key, int value) {
        if(map.containsKey(key)){
            Node old = map.get(key);
            old.value = value;
            remove(old);
            setHead(old);
        }else{
            Node created = new Node(key, value);
            if(map.size()>=capacity){
                map.remove(end.key);
                remove(end);
                setHead(created);
 
            }else{
                setHead(created);
            }    
 
            map.put(key, created);
        }
    }
}

關(guān)于操作系統(tǒng)的內(nèi)存管理,如何節(jié)省利用容量不大的內(nèi)存為最多的進(jìn)程提供資源备埃,一直是研究的重要方向姓惑。而內(nèi)存的虛擬存儲(chǔ)管理,是現(xiàn)在最通用按脚,最成功的方式—— 在內(nèi)存有限的情況下于毙,擴(kuò)展一部分外存作為虛擬內(nèi)存,真正的內(nèi)存只存儲(chǔ)當(dāng)前運(yùn)行時(shí)所用得到信息辅搬。這無(wú)疑極大地?cái)U(kuò)充了內(nèi)存的功能唯沮,極大地提高了計(jì)算機(jī)的并發(fā)度。虛擬頁(yè)式存儲(chǔ)管理堪遂,則是將進(jìn)程所需空間劃分為多個(gè)頁(yè)面介蛉,內(nèi)存中只存放當(dāng)前所需頁(yè)面,其余頁(yè)面放入外存的管理方式溶褪。

有利就有弊币旧,虛擬頁(yè)式存儲(chǔ)管理增加了進(jìn)程所需的內(nèi)存空間,卻也帶來(lái)了運(yùn)行時(shí)間變長(zhǎng)這一缺點(diǎn):進(jìn)程運(yùn)行過(guò)程中猿妈,不可避免地要把在外存中存放的一些信息和內(nèi)存中已有的進(jìn)行交換吹菱,由于外存的低速,這一步驟所花費(fèi)的時(shí)間不可忽略彭则。因而毁葱,采取盡量好的算法以減少讀取外存的次數(shù),也是相當(dāng)有意義的事情贰剥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末倾剿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌前痘,老刑警劉巖凛捏,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芹缔,居然都是意外死亡坯癣,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)最欠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)示罗,“玉大人,你說(shuō)我怎么就攤上這事芝硬⊙恋悖” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵拌阴,是天一觀的道長(zhǎng)绍绘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)迟赃,這世上最難降的妖魔是什么陪拘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮纤壁,結(jié)果婚禮上左刽,老公的妹妹穿的比我還像新娘。我一直安慰自己酌媒,他們只是感情好悠反,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著馍佑,像睡著了一般斋否。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拭荤,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天茵臭,我揣著相機(jī)與錄音,去河邊找鬼舅世。 笑死旦委,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雏亚。 我是一名探鬼主播缨硝,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罢低!你這毒婦竟也來(lái)了查辩?” 一聲冷哼從身側(cè)響起胖笛,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宜岛,沒(méi)想到半個(gè)月后长踊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萍倡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年身弊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片列敲。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阱佛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出戴而,到底是詐尸還是另有隱情凑术,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布填硕,位于F島的核電站麦萤,受9級(jí)特大地震影響鹿鳖,放射性物質(zhì)發(fā)生泄漏扁眯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一翅帜、第九天 我趴在偏房一處隱蔽的房頂上張望姻檀。 院中可真熱鬧,春花似錦涝滴、人聲如沸绣版。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杂抽。三九已至,卻和暖如春韩脏,著一層夾襖步出監(jiān)牢的瞬間缩麸,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工赡矢, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杭朱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓吹散,卻偏偏與公主長(zhǎng)得像弧械,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子空民,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容