LeetCode 146 [LRU Cache]

原題

為最近最少使用(LRU)緩存策略設(shè)計(jì)一個(gè)數(shù)據(jù)結(jié)構(gòu)强挫,它應(yīng)該支持以下操作:獲取數(shù)據(jù)(get)和寫入數(shù)據(jù)(set)。
1.獲取數(shù)據(jù)get(key)
:如果緩存中存在key衩婚,則獲取其數(shù)據(jù)值(通常是正數(shù))馋记,否則返回-1。
2.寫入數(shù)據(jù)
set(key, value)
:如果key還沒有在緩存中昵宇,則寫入其數(shù)據(jù)值。當(dāng)緩存達(dá)到上限儿子,它應(yīng)該在寫入新數(shù)據(jù)之前刪除最近最少使用的數(shù)據(jù)用來騰出空閑位置瓦哎。

解題思路

  • 第一過程中涉及membership的查詢 -> Hash Table

  • 第二過程中涉及一個(gè)個(gè)的 -> Linked List (數(shù)組不適合,數(shù)組適合一批一批的增刪)

  • Linked List中的每個(gè)node要有next和prev屬性杭煎,要同時(shí)記錄Dummy(head)和tail

  • 本解法采用的singly linked list所以hash表里面存的key指向的是前一個(gè)node

  • 越最近使用的存在鏈表的尾部,假設(shè)鏈表長度已經(jīng)達(dá)到上限

  • 如果新來的值存在于鏈表卒落,則踢除羡铲,然后加到尾部

  • 如果信賴的值不在鏈表中,則剔除開頭的值儡毕,然后新值加到尾部

完整代碼

class LinkedNode:

    def __init__(self, key=None, value=None, next=None):
        self.key = key
        self.value = value
        self.next = next
        
class LRUCache(object):

    def __init__(self, capacity):
        """
        :type capacity: int
        """
        self.hash = {}
        self.head = LinkedNode()
        self.tail = self.head
        self.capacity = capacity
        
    def push_back(self, node):
        self.hash[node.key] = self.tail
        self.tail.next = node
        self.tail = node
        
    def pop_front(self):
        del self.hash[self.head.next.key]
        self.head.next = self.head.next.next
        self.hash[self.head.next.key] = self.head
        
    # change "prev->node->next...->tail"
    # to "prev->next->...->tail->node"
    def kick(self, prev):
        node = prev.next
        if node == self.tail:
            return
        prev.next = node.next
        if node.next is not None:
            self.hash[node.next.key] = prev
            node.next = None
        self.push_back(node)

    def get(self, key):
        """
        :rtype: int
        """
        if key not in self.hash:
            return -1
        self.kick(self.hash[key])
        return self.hash[key].next.value
        
    def set(self, key, value):
        """
        :type key: int
        :type value: int
        :rtype: nothing
        """
        if key in self.hash:
            self.kick(self.hash[key])
            self.hash[key].next.value = value
        else:
            self.push_back(LinkedNode(key, value))
            if len(self.hash) > self.capacity:
                self.pop_front()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末也切,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腰湾,更是在濱河造成了極大的恐慌雷恃,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件费坊,死亡現(xiàn)場離奇詭異倒槐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)附井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門讨越,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人永毅,你說我怎么就攤上這事把跨。” “怎么了沼死?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵着逐,是天一觀的道長。 經(jīng)常有香客問我意蛀,道長耸别,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任浸间,我火速辦了婚禮太雨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘魁蒜。我一直安慰自己囊扳,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布兜看。 她就那樣靜靜地躺著锥咸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪细移。 梳的紋絲不亂的頭發(fā)上搏予,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音弧轧,去河邊找鬼雪侥。 笑死碗殷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的速缨。 我是一名探鬼主播锌妻,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼旬牲!你這毒婦竟也來了仿粹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤原茅,失蹤者是張志新(化名)和其女友劉穎吭历,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擂橘,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晌区,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了通贞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片契讲。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖滑频,靈堂內(nèi)的尸體忽然破棺而出捡偏,到底是詐尸還是另有隱情,我是刑警寧澤峡迷,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布银伟,位于F島的核電站,受9級(jí)特大地震影響绘搞,放射性物質(zhì)發(fā)生泄漏彤避。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一夯辖、第九天 我趴在偏房一處隱蔽的房頂上張望琉预。 院中可真熱鬧,春花似錦蒿褂、人聲如沸圆米。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娄帖。三九已至,卻和暖如春昙楚,著一層夾襖步出監(jiān)牢的瞬間近速,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留削葱,地道東北人奖亚。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像析砸,于是被迫代替她去往敵國和親遂蛀。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx干厚?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,646評(píng)論 24 1,002
  • Design and implement a data structure for Least Recently ...
    ShutLove閱讀 275評(píng)論 0 0
  • java筆記第一天 == 和 equals ==比較的比較的是兩個(gè)變量的值是否相等螃宙,對(duì)于引用型變量表示的是兩個(gè)變量...
    jmychou閱讀 1,488評(píng)論 0 3
  • “媽蛮瞄,吳釗辰來我們家玩了!更搞笑的是谆扎,我們?nèi)リ柵_(tái)看鸚鵡回來的時(shí)候挂捅。你那個(gè)君子蘭是不是已經(jīng)爛根了,被風(fēng)給吹掉...
    鄭赫閱讀 420評(píng)論 0 1
  • 我叫劉月堂湖,坐標(biāo)北京闲先,在外貿(mào)公司工作,我們主要引進(jìn)英國頂級(jí)西服面料Holland&Sherry无蜂,是國內(nèi)的獨(dú)家代理商伺糠,...
    劉月Luna閱讀 378評(píng)論 4 6