題目描述
設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能
set(key, value):將記錄(key, value)插入該結構
get(key):返回key對應的value值
[要求]
set和get方法的時間複雜度為o(1)
某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。
當快取的大小超過k時,移除最不經常使用的記錄,即set或get最久遠的。
若opt=1,接下來兩個整數x, y,表示set(x, y)
若opt=2,接下來乙個整數x,表示get(x),若x未出現過或已被移除,則返回-1
對於每個操作2,輸出乙個答案
示例1輸入
複製[[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3
輸出複製
[1,-1]
說明第一次操作後:最常使用的記錄為("1", 1)
第二次操作後:最常使用的記錄為("2", 2),("1", 1)變為最不常用的
第三次操作後:最常使用的記錄為("3", 2),("1", 1)還是最不常用的
第四次操作後:最常用的記錄為("1", 1),("2", 2)變為最不常用的
第五次操作後:大小超過了3,所以移除此時最不常使用的記錄("2", 2),加入記錄("4", 4),並且為最常使用的記錄,然後("3", 2)變為最不常使用的記錄
備註:1 \leq k \leq n \leq 10^51≤k≤n≤10 5
-2 \times 10^9 \leq x,y \leq 2 \times 10^9−2×10
9 ≤x,y≤2×10
9
實現:linkedhashmap
描述:結合了hashmap和linkedlist,在插入時可根據訪問順序排序,每次訪問都會將訪問的資料移到鍊錶最後,也可根據key,value進行查詢
複製**
public static void main(string args)
public static void looplinkedhashmap(linkedhashmaplinkedhashmap)
system.out.println();
}
複製**
注意這裡的構造方法要用三個引數那個且最後的要傳入true,這樣才表示按照訪問順序排序。看一下**執行結果:
111=111 222=222 333=333 444=444
222=222 333=333 444=444 111=111
333=333 444=444 111=111 222=2222
**執行結果證明了兩點:
1、linkedlist是有序的
2、每次訪問乙個元素(get或put),被訪問的元素都被提到最後面去了
LRU快取機制演算法實現
就是一種快取淘汰策略。計算機的快取容量有限,如果快取滿了就要刪除一些內容,給新內容騰位置。但問題是,刪除哪些內容呢?我們肯定希望刪掉哪些沒什麼用的快取,而把有用的資料繼續留在快取裡,方便之後繼續使用。那麼,什麼樣的資料,我們判定為 有用的 的資料呢?lru 快取淘汰演算法就是一種常用策略。lru 的...
LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...
LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...