面試高頻題 LRU快取機制實現

2021-10-24 19:57:16 字數 1710 閱讀 1666

題目

運用你所掌握的資料結構,設計和實現乙個  lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。

獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。

寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。

高階:你是否可以在 o(1) 時間複雜度內完成這兩種操作?

示例:lrucache cache = new lrucache( 2 /* 快取容量 */ );

cache.put(1, 1);

cache.put(2, 2);

cache.get(1); // 返回 1

cache.put(3, 3); // 該操作會使得金鑰 2 作廢

cache.get(2); // 返回 -1 (未找到)

cache.put(4, 4); // 該操作會使得金鑰 1 作廢

cache.get(1); // 返回 -1 (未找到)

cache.get(3); // 返回 3

cache.get(4); // 返回 4

思路:hash+雙鏈表

//get和put操作需要在0(1)複雜度完成

type lrucache struct

type dlinkednode struct

//初始化乙個節點

func initdlinkednode(key, value int) *dlinkednode

}//初始化乙個雙向鍊錶

func constructor(capacity int) lrucache ,

head: initdlinkednode(0, 0),

tail: initdlinkednode(0, 0),

capacity: capacity,

}l.head.next = l.tail

l.tail.prev = l.head

return l

}//獲取資料

func (this *lrucache) get(key int) int

//cache是雜湊表

node := this.cache[key]

//鍊錶記錄順序

this.movetohead(node)

return node.value

}//寫入資料

func (this *lrucache) put(key int, value int)

} else

}//頭部增加節點

func (this *lrucache) addtohead(node *dlinkednode)

//刪除節點

func (this *lrucache) removenode(node *dlinkednode)

//將該節點移到頭部

func (this *lrucache) movetohead(node *dlinkednode)

//移除尾部節點

func (this *lrucache) removetail() *dlinkednode

hash訪問key,value快,鍊錶儲存順序。每次新增節點,將節點放到鍊錶首部,還要判斷lru的容量確定是否刪除隊尾節點。

LRU快取機制實現

題目描述 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 set key,value 將記錄 key,value 插入該結構 get key 返回key對應的value值 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key...

LRU快取機制演算法實現

就是一種快取淘汰策略。計算機的快取容量有限,如果快取滿了就要刪除一些內容,給新內容騰位置。但問題是,刪除哪些內容呢?我們肯定希望刪掉哪些沒什麼用的快取,而把有用的資料繼續留在快取裡,方便之後繼續使用。那麼,什麼樣的資料,我們判定為 有用的 的資料呢?lru 快取淘汰演算法就是一種常用策略。lru 的...

LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...