Leetcode刷題 LFU快取

2022-05-12 20:37:20 字數 1977 閱讀 8394

題目:

思路: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會跟蹤快取中的專案的被訪問順序。按照請求順序儲存專案。因此,最近使用的專案將位於快取的頂部,而最近最少用的專...