經(jīng)典面試題24 - 如何設計實現(xiàn)LRU緩存

問題

如何設計實現(xiàn)LRU緩存?且Set() 和 Get() 的復雜度為O(1)。

解答

LRU,全稱Least Recently Used内地,最近最少使用緩存。

在設計數(shù)據(jù)結構時赋除,需要能夠保持順序阱缓,且是最近使用過的時間順序被記錄,這樣每個item的相對位置代表了最近使用的順序举农。滿足這樣考慮的結構可以是鏈表或者數(shù)組荆针,不過鏈表更有利于Insert和Delete的操縱。

此外并蝗,需要記錄鏈表的head和tail祭犯,從而方便進行移動到tail或者刪除head的操作:
head.next作為最近最少使用的item,tail.prev為最近使用過的item滚停,

  • 在set時沃粗,如果超出capacity,則刪除head.next键畴,同時將要插入的item放入tail.prev,
  • 在get時最盅,如果存在,只需把item更新到tail.prev即可起惕。

這樣set與get均為O(1)時間的操作 (HashMap Get/Set + LinkedList Insert/Delete)涡贱,空間復雜度為O(n), n為capacity。

public class LRUCache {
    private class Node {
        Node prev;
        Node next;
        int key;
        int value;

        public Node(int key, int value) {
            this.key = key;
            this.value = value;
            this.prev = null;
            this.next = null;
        }
    }

    private int capacity;
    private HashMap<Integer, Node> hm = new HashMap<Integer, Node>();
    private Node head = new Node(-1, -1);
    private Node tail = new Node(-1, -1);

    // @param capacity, an integer
    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.head.next = this.tail;
        this.tail.prev = this.head;
    }

    // @return an integer
    public int get(int key) {
        if (!hm.containsKey(key)) {
            return -1;
        }
        Node current = hm.get(key);
        current.prev.next = current.next;
        current.next.prev = current.prev;

        moveToTail(current);

        return hm.get(key).value;
    }

    // @param key, an integer
    // @param value, an integer
    // @return nothing
    public void set(int key, int value) {
        if (get(key) != -1) {
            hm.get(key).value = value;
            return;
        }
        if (hm.size() == capacity) {
            hm.remove(head.next.key);
            head.next = head.next.next;
            head.next.prev = head;
        }

        Node insert = new Node(key, value);
        hm.put(key, insert);
        moveToTail(insert);
    }

    private void moveToTail(Node current) {
        current.next = tail;
        tail.prev.next = current;
        current.prev = tail.prev;
        tail.prev = current;
    }
}

更多

經(jīng)典面試100題 - 持續(xù)更新中

獲取更多內(nèi)容請關注微信公眾號豆志昂揚:

  • 直接添加公眾號豆志昂揚惹想;
  • 微信掃描下圖二維碼问词;
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嘀粱,隨后出現(xiàn)的幾起案子激挪,更是在濱河造成了極大的恐慌辰狡,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垄分,死亡現(xiàn)場離奇詭異宛篇,居然都是意外死亡,警方通過查閱死者的電腦和手機薄湿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門叫倍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人豺瘤,你說我怎么就攤上這事吆倦。” “怎么了炉奴?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵逼庞,是天一觀的道長。 經(jīng)常有香客問我瞻赶,道長,這世上最難降的妖魔是什么派任? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任砸逊,我火速辦了婚禮,結果婚禮上掌逛,老公的妹妹穿的比我還像新娘师逸。我一直安慰自己,他們只是感情好豆混,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布篓像。 她就那樣靜靜地躺著,像睡著了一般皿伺。 火紅的嫁衣襯著肌膚如雪员辩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天鸵鸥,我揣著相機與錄音奠滑,去河邊找鬼。 笑死妒穴,一個胖子當著我的面吹牛宋税,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播讼油,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼杰赛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了矮台?” 一聲冷哼從身側響起乏屯,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤根时,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瓶珊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體啸箫,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年伞芹,在試婚紗的時候發(fā)現(xiàn)自己被綠了忘苛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡唱较,死狀恐怖扎唾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情南缓,我是刑警寧澤胸遇,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站汉形,受9級特大地震影響纸镊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜概疆,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一逗威、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岔冀,春花似錦凯旭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侦高,卻和暖如春嫉柴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背矫膨。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工差凹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侧馅。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓危尿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馁痴。 傳聞我的和親對象是個殘疾皇子谊娇,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

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