題目
運用你所掌握的資料結構,設計和實現乙個 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 如果金鑰不存在,則寫入其資料值。...