設計和構建乙個「最近最少使用」快取,該快取會刪除最近最少使用的專案。快取應該從鍵對映到值(允許你插入和檢索特定鍵對應的值),並在初始化時指定最大容量。當快取被填滿時,它應該刪除最近最少使用的專案。**:它應該支援以下操作: 獲取資料 get 和 寫入資料 put 。
獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。
寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。
示例: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
# -*- coding: utf-8 -*-
"""created on tue aug 4 11:29:38 2020
@author: wowlnan
@github:
@csdn:
"""import time
class lrucache:
def __init__(self, capacity: int):
self.capacity=capacity
self.cache={}
self.access={}
def get(self, key: int) -> int:
if self.cache==none or self.cache=={}:
return -1
try:
value=self.cache.get(key, -1)
if value!=-1:
self.access[key]=time.time()
return value
except:
return -1
def put(self, key: int, value: int) -> none:
if len(self.cache)>=self.capacity:
if self.get(key)!=-1:
self.cache[key]=value
self.access[key]=time.time()
else:
acs=self.access.items()
last_access=none
last_key=none
for o in acs:
if last_key==none and last_access==none:
last_access=o[1]
last_key=o[0]
elif last_access>o[1]:
last_access=o[1]
last_key=o[0]
del self.cache[last_key]
del self.access[last_key]
self.cache[key]=value
self.access[key]=time.time()
else:
self.cache[key]=value
self.access[key]=time.time()
# your lrucache object will be instantiated and called as such:
# obj = lrucache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)
s=lrucache(2)
s.put(1,1)
s.put(2,2)
print(s.get(1))
s.put(3,3)
print(s.get(2))
s.put(4,4)
print(s.get(1))
print(s.get(3))
print(s.get(4))
print(s.cache)
lru快取遵循「最近最少使用」的基本準則。「使用」的概念包含訪問和修改等。這裡直接使用時間戳來描述規則。這樣的做法比較簡單基礎。複雜點的應該加入使用次數。進行put操作超出指定的元素長度時,時間複雜度理論是o(n)。 LRU快取演算法
為什麼要有lru快取演算法 我們用快取來存放以前讀取的資料,而不是直接丟掉,這樣,再次讀取的時候,可以直接在快取裡面取,而不用再重新查詢一遍,這樣系統的反應能力會有很大提高。但是,當我們讀取的個數特別大的時候,我們不可能把所有已經讀取的資料都放在快取裡,畢竟記憶體大小是一定的,我們一般把最近常讀取的...
LRU演算法 快取演算法
lru演算法主要用於快取演算法,在節省資源的情況下提高資料訪問效率 篩選熱點資料 對不斷訪問的資料進行篩選淘汰,剩下的資料就為熱點資料 相對而言,釋放最近未被訪問資料占用的空間也是採用lru演算法。1 lru的實現 鍊錶 使用乙個鍊錶儲存快取資料 1 新資料插入到鍊錶頭部 2 每當快取命中 即快取資...
快取淘汰演算法 LRU
1.lru 1.1.原理 lru least recently used,最近最少使用 演算法根據資料的歷史訪問記錄來進行淘汰資料,其核心思想是 如果資料最近被訪問過,那麼將來被訪問的機率也更高 1.2.實現 最常見的實現是使用乙個鍊錶儲存快取資料,詳細演算法實現如下 1.新資料插入到鍊錶頭部 2....