day5 難度:困難
題幹:
設計並實現最不經常使用(lfu)快取的資料結構。它應該支援以下操作:get 和 put。
get(key) - 如果鍵存在於快取中,則獲取鍵的值(總是正數),否則返回 -1。
put(key, value) - 如果鍵不存在,請設定或插入值。當快取達到其容量時,它應該在插入新專案之前,使最不經常使用的專案無效。在此問題中,當存在平局(即兩個或更多個鍵具有相同使用頻率)時,最近最少使用的鍵將被去除。
示例:
lfucache cache = new lfucache( 2 /* capacity (快取容量) */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 去除 key 2
cache.get(2); // 返回 -1 (未找到key 2)
cache.get(3); // 返回 3
cache.put(4, 4); // 去除 key 1
cache.get(1); // 返回 -1 (未找到 key 1)
cache.get(3); // 返回 3
cache.get(4); // 返回 4
思路:
根據題目要求,快取用字典表示,內容有[value, freq, time]值,頻率,時間**:在獲取和設定之前,都應該先使time+1
在相同頻率的時候,驗證time
具體步驟,參考**中注釋
class
lfucache
:def
__init__
(self, capacity:
int)
: self.capacity = capacity # 快取容量
self.time =
0# 時間計數,每次呼叫get()則+1
self.obj =
# key:[value, freq, time]
defget
(self, key:
int)
->
int:
if key in self.obj:
self.time +=
1# 使用時間+1
self.obj[key][1
]+=1# 頻率加1
self.obj[key][2
]= self.time
return self.obj[key][0
]else
:return-1
defput
(self, key:
int, value:
int)
->
none
:if self.capacity ==0:
# 快取容量為0
return
none
self.time +=
1if key in self.obj:
# key在obj中
self.obj[key][0
]= value
self.obj[key][1
]+=1 self.obj[key][2
]= self.time
return
none
else
:# key不在obj中
iflen
(self.obj)
< self.capacity:
# 快取容量未滿,直接新增key,value
self.obj[key]
=[value,
1, self.time]
else
:# 快取容量已滿,找到頻率最低的key
less_freq =
min(self.obj.values(
), key=
lambda x: x[1]
)[1]
keys =
[i for i ,j in self.obj.items(
)if j[1]
== less_freq]
iflen
(keys)==1
:# 只有乙個頻率最低的key,直接刪除
del self.obj[keys[0]
]else
:# 有多個頻率最低的,找出時間最小的,刪除
less_key = keys[0]
less_time = self.obj[less_key][2
]for i in keys:
if self.obj[i][2
]< less_time:
less_key = i
less_time = self.obj[less_key][2
]del self.obj[less_key]
self.obj[key]
=[value,
1, self.time]
# your lfucache object will be instantiated and called as such:
# obj = lfucache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)
演算法題 LFU快取
題目 設計並實現最不經常使用 lfu 快取的資料結構。它應該支援以下操作 get 和 put。get key 如果鍵存在於快取中,則獲取鍵的值 總是正數 否則返回 1。put key,value 如果鍵不存在,請設定或插入值。當快取達到其容量時,它應該在插入新專案之前,使最不經常使用的專案無效。在此...
LFU演算法實現(460 LFU快取)
今天位元組客戶端三面問了這道題,沒做出來。第一,之前沒見過lfu,第二,要求o 1 時間,條件苛刻一點。只能說無緣位元組。言歸正傳,lfu演算法 least frequently used,最近最不經常使用演算法。什麼意思呢 對於每個條目,維護其使用次數cnt 最近使用時間time。cache容量為...
LFU快取策略
example lfucache cache new lfucache 2 capacity cache.put 1,1 cache.put 2,2 cache.get 1 returns 1 cache.put 3,3 evicts key 2 cache.get 2 returns 1 not ...