這是我參與更文挑戰的第23天,活動詳情查看: 更文挑戰node
運用你所掌握的數據結構,設計和實現一個
LRU
(最近最少使用) 緩存機制 。 實現LRUCache
類:緩存
LRUCache(int capacity)
以正整數做爲容量 capacity 初始化LRU
緩存 int get(int key) 若是關鍵字 key 存在於緩存中,則返回關鍵字的值,不然返回 -1 。 void put(int key, int value) 若是關鍵字已經存在,則變動其數據值;若是關鍵字不存在,則插入該組「關鍵字-值」。當緩存容量達到上限時,它應該在寫入新數據以前刪除最久未使用的數據值,從而爲新的數據值留出空間。markdown進階:你是否能夠在 O(1) 時間複雜度內完成這兩種操做?數據結構
LinkedHashMap
LinkedHashMap
不熟悉的朋友們能夠簡單的將它理解成HashMap
。 下圖展現了HashMap
的存儲結構LinkedHashMap
只是多了一條鏈表串起裏面的元素LinkedHashMap
是按照順序存儲的。可是LinkedHahsMap
也沒法作到按照使用頻率進行排序啊?你們都知道他是按照添加順序排序的!!!LinkedHashMap
*改造LinkedHashMap
的確沒法知足狀況,可是咱們稍微看下源碼可以發如今put以後都會執行下afterNodeInsertion
這個方法。這也是HashMap
留給LinkedHashMap
作的擴展!removeNode
就是將最前面的數據。想要進入這個方法就須要removeEldestEntry
判斷。LinkedHashMap
默認是false . 因此咱們只須要重寫他就好了。可是仍是在get值的時候如何保值在最後面呢?咱們仔細看下源碼就可以發如今get
中有這個一個方法afterNodeAccess
。他的做用就是將get的元素移位值後面。正好符合咱們LRU
的策略特徵LinkedHashMap
就很是容易的實現了LRU策略!可是本題的意思是想考察咱們本身是如何實現的,而不是巧妙對現有的工具改造的!不過上面對LinkedHashMap
的確改造的很巧這是不能否認的!下面咱們就嘗試本身來實現下這種方式!工具
首先咱們須要肯定須要用到Hash結合鏈表來實現。Hash咱們天然使用HashMap
來存儲數據爲的就是方便定位數據。定位到數據就須要操做鏈表將數據實時移位值鏈表尾部,每次淘汰是將鏈表首位移除既可。爲了方便咱們操做鏈表這裏的鏈表確定是雙鏈表的!oop
preNode
,nextNode
分別指向先後節點方法名 | 做用 |
---|---|
addToTail | 將節點添加值鏈表尾部 |
moveToTail | 將已經存在於鏈表中的節點移動到鏈表的尾部 |
removeHeadNode | 刪除鏈表中第一個節點,注意是邊界節點後第一個節點 |