題目:
思路:o(1)的資料結構:hashmap
維持最近使用:orderddict(詳見lru快取問題)
使用乙個hashmap維繫key到出現頻率的對映關係
另乙個hashmap維繫頻率到資料(key-value鍵值對)的關係
由於 當存在平局(即兩個或更多個鍵具有相同使用頻率)時,應該去除 最近 最少使用的鍵。因此key-value鍵值對應該用orderddict儲存
import collections
class lfucache:
# self.key_fre是key到出現頻率的對映關係
# self.fre_data格式:
# # ...
# }def __init__(self, capacity: int):
self.capacity = capacity
self.count = 0
self.key_fre = {}
# 同一頻率下,去除最近最少使用的健,退化為lru快取問題
self.fre_data = {}
self.min_fre = 1
# 更新某一鍵值對的頻率
def update_fre(self, key, value=none):
# 需要從self.fre_data中取值
fre = self.key_fre[key]
next_fre = fre + 1
# 從原頻率字典刪除
res = self.fre_data[fre].pop(key)
# 如果當前頻率是最小頻率,且字典為空,則更新最小頻次記錄
if fre == self.min_fre and not self.fre_data[fre]:
self.min_fre = next_fre
# 插入下乙個頻率字典
if next_fre not in self.fre_data:
self.fre_data[next_fre] = collections.ordereddict()
self.fre_data[next_fre][key] = value if value is not none else res
# 修改原key與頻率的對應關係
self.key_fre[key] = next_fre
return res
def get(self, key: int) -> int:
if key not in self.key_fre:
return -1
return self.update_fre(key)
def put(self, key: int, value: int) -> none:
# capacity還能是0
if self.capacity == 0:
return
# 如果是更新,則要變更key所處頻率字典
if key in self.key_fre:
self.update_fre(key, value)
else:
if self.count >= self.capacity:
# 快取已滿,從最小頻次字典中pop最少使用的
item = self.fre_data[self.min_fre].popitem(last=false)
# 刪掉對應key與頻率的對映關係
del self.key_fre[item[0]]
else:
self.count += 1
# 新加入,更新最小頻率
self.min_fre = 1
self.key_fre[key] = 1
if 1 not in self.fre_data:
self.fre_data[1] = collections.ordereddict()
self.fre_data[1][key] = value
演算法題 LFU快取
題目 設計並實現最不經常使用 lfu 快取的資料結構。它應該支援以下操作 get 和 put。get key 如果鍵存在於快取中,則獲取鍵的值 總是正數 否則返回 1。put key,value 如果鍵不存在,請設定或插入值。當快取達到其容量時,它應該在插入新專案之前,使最不經常使用的專案無效。在此...
LEETCODE 460 實現LFU快取
方法一 雙雜湊表法 題目要求需要在常數時間完成插入和查詢演算法,聯絡之前的lru演算法,很容易想到用雜湊表。具體做法如下 第乙個雜湊表儲存 使用頻率freq和乙個雙向鍊錶這樣一對對映,鍊錶的每個節點儲存key value和freq 使用頻率 第二個雜湊表儲存freq和鍊錶中的乙個節點這樣一對對映 1...
leetcode刷題之LRU快取
關於此快取機制的介紹,參考國外大佬的文章 lru cache least recently used cache 是最流行的快取驅逐策略之一。同時也是乙個非常常見的面試問題。lru cache會跟蹤快取中的專案的被訪問順序。按照請求順序儲存專案。因此,最近使用的專案將位於快取的頂部,而最近最少用的專...