如何用鏈表實現(xiàn)LRU 緩存淘汰策略运提?

今天學(xué)習(xí)了鏈表(linked list)這個數(shù)據(jù)結(jié)構(gòu)蝗柔。學(xué)習(xí)鏈表有啥用呢?如何用鏈表來實現(xiàn)“LRU緩存淘汰算法”呢民泵?思路是啥呢癣丧?。
LRU 是啥栈妆?胁编?
LRU(Least Recently Used)最近最少使用策略。緩存的容量是有限的
當(dāng)緩存容量不足以存放需要緩存的新數(shù)據(jù)時鳞尔,必須丟掉最不常用的緩存數(shù)據(jù)嬉橙。

先來看看鏈表是啥吧

鏈表結(jié)構(gòu)

以前因為好奇, 我跟著豆豆一起學(xué)過一些鏈表的基本概念寥假,大概理解為:鏈表像是一個鐵鏈子市框,一環(huán)扣一環(huán)。每一環(huán)也只知道自己的前后是誰糕韧。鏈表用一個next連接這自己的下一個元素枫振。

好像這個概念和我們之前說的數(shù)組很像呢,確實很像萤彩,那有什么不一樣的地方呢蒋得?
數(shù)組是可以任意訪問的,但是鏈表要訪問其中的第n 個元素的時候乒疏,只能從頭開始找额衙。這樣,時間復(fù)雜度一直都是O(n) 鏈表不需要一個連續(xù)的存儲空間怕吴,他的每個元素可以是零散的窍侧。如果內(nèi)存不足的時候,申請一個超過內(nèi)存的鏈表也是可以成功的转绷,但是數(shù)組就不得行了伟件。

  • 單鏈表
    我比較喜歡單鏈表,人家多單純啊议经,只是單向的用next連接著自己的下一個元素斧账。最后一個結(jié)點的 next指向null 就好了, 如果想給里面插入或者刪掉數(shù)據(jù)的時候,很簡單的做法就是直接改變相應(yīng)的next 指針指向就好了煞肾。

  • 循環(huán)鏈表
    循環(huán)鏈表和單鏈表的區(qū)別就是最后一個next 指針指向第一個咧织,這樣就能形成一個單項的環(huán)。

  • 雙向鏈表
    前面的單鏈表和循環(huán)鏈表都只是單向的籍救,那么雙向鏈接的區(qū)別就是除了有next,還會定義prev习绢。這樣每個item 不僅僅需要存儲next ,還需要存儲prev,這樣肯定會更多的消耗空間闪萄,那它相對于單向的好處是什么呢梧却?
    ``

  • 雙向循環(huán)鏈表
    雙向循環(huán)鏈表 就是雙向鏈表 + 循環(huán)鏈表。兩個特性的結(jié)合
    ``

從結(jié)構(gòu)上來看败去,雙向鏈表可以在O(1)的時間復(fù)雜度里面放航,找到前一個item。但是在單鏈表里面圆裕,需要重新再循環(huán)一次整個鏈表广鳍,時間復(fù)雜度就是O(n)

在實際的開發(fā)中,指定新增和指定刪除的時候葫辐,雙向鏈表的性能都要高于單向鏈表
相對于數(shù)組,鏈表更適用于更加頻繁的插入伴郁,刪除耿战,和復(fù)雜度更高的場景。

如何基于鏈表實現(xiàn) LRU 緩存淘汰算法焊傅?

基礎(chǔ)思路是:

維護一個單向鏈表剂陡,越靠近鏈表尾部的結(jié)點是越早之前訪問的。當(dāng)有一個新的數(shù)據(jù)被訪問時狐胎,我們從鏈表頭開始順序遍歷鏈表鸭栖。  
if 這個鏈表里,本身有這個item握巢,那么就把這個item 從原來的位置刪掉晕鹊,然后插入到鏈表頭的位置 
else 直接插入到頭部(可能還需要兼容考慮此時緩存是否滿)

我感覺用數(shù)組應(yīng)該也是這個思路。只是實現(xiàn)方式不一樣而已

今天又是學(xué)習(xí)理論知識的一天暴浦,期待實踐s溅话。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歌焦,隨后出現(xiàn)的幾起案子飞几,更是在濱河造成了極大的恐慌,老刑警劉巖独撇,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屑墨,死亡現(xiàn)場離奇詭異,居然都是意外死亡纷铣,警方通過查閱死者的電腦和手機卵史,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搜立,“玉大人程腹,你說我怎么就攤上這事∪宸鳎” “怎么了寸潦?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵色鸳,是天一觀的道長。 經(jīng)常有香客問我见转,道長命雀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任斩箫,我火速辦了婚禮吏砂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乘客。我一直安慰自己狐血,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布易核。 她就那樣靜靜地躺著匈织,像睡著了一般。 火紅的嫁衣襯著肌膚如雪牡直。 梳的紋絲不亂的頭發(fā)上缀匕,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音碰逸,去河邊找鬼乡小。 笑死,一個胖子當(dāng)著我的面吹牛饵史,可吹牛的內(nèi)容都是我干的满钟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼胳喷,長吁一口氣:“原來是場噩夢啊……” “哼零远!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厌蔽,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤牵辣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奴饮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纬向,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年戴卜,在試婚紗的時候發(fā)現(xiàn)自己被綠了逾条。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡投剥,死狀恐怖师脂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤吃警,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布糕篇,位于F島的核電站,受9級特大地震影響酌心,放射性物質(zhì)發(fā)生泄漏拌消。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一安券、第九天 我趴在偏房一處隱蔽的房頂上張望墩崩。 院中可真熱鬧,春花似錦侯勉、人聲如沸鹦筹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铐拐。三九已至,卻和暖如春芳誓,著一層夾襖步出監(jiān)牢的瞬間余舶,已是汗流浹背啊鸭。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工锹淌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赠制。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓赂摆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親钟些。 傳聞我的和親對象是個殘疾皇子烟号,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348