python每日演算法 LFU快取(Day5)

2021-10-04 18:46:25 字數 2775 閱讀 2983

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 ...