LEETCODE 460 實現LFU快取

2021-10-04 18:34:01 字數 1498 閱讀 1095

方法一:雙雜湊表法

題目要求需要在常數時間完成插入和查詢演算法,聯絡之前的lru演算法,很容易想到用雜湊表。具體做法如下:

第乙個雜湊表儲存 使用頻率freq乙個雙向鍊錶這樣一對對映,鍊錶的每個節點儲存key valuefreq(使用頻率);

第二個雜湊表儲存freq鍊錶中的乙個節點這樣一對對映;

1.對於get()操作

首先根據key找到對應的鍊錶節點,從而在第二個雜湊表中找到value,freq,同時將該節點從當前鍊錶刪除(如果刪除後為空,可能需要更新最小freq).將freq+1,新建乙個節點插入下乙個鍊錶中;

2.對於put()操作

如果key已經存在,那麼等同於get()操作,只需要另外將value更新就可以;

否則,判斷當前是否達到了最大容量限制,若沒有則只需要新建乙個節點,更新兩個雜湊表和最小使用頻率即可;若達到了最大最大容量,找到最小使用頻率對應的節點,將其從兩個雜湊表中刪除,同時可能需要更新最小使用頻率;

class

lfucache};

unordered_map<

int,list>cache;

//以頻率為索引

unordered_map<

int,list

::iterator>sea;

//以鍵值為索引

int sz;

int minfreq;

public

:lfucache

(int capacity)

intget

(int key)

sea[key]

=cache[f+1]

.begin()

;return val;

}void

put(

int key,

int value)

else

sea.

erase

(k);

}auto no=

node

(key,value,1)

; cache[1]

.push_front

(no)

; minfreq=1;

sea[key]

=cache[1]

.begin()

;}}}

;

LFU演算法實現(460 LFU快取)

今天位元組客戶端三面問了這道題,沒做出來。第一,之前沒見過lfu,第二,要求o 1 時間,條件苛刻一點。只能說無緣位元組。言歸正傳,lfu演算法 least frequently used,最近最不經常使用演算法。什麼意思呢 對於每個條目,維護其使用次數cnt 最近使用時間time。cache容量為...

LeetCode 關於實現strStr

toc 實現 strstr 函式。給定乙個 haystack 字串和乙個 needle 字串,在 haystack 字串中找出 needle 字串出現的第乙個位置 從0開始 如果不存在,則返回 1。要討論字串haystack和字串needle三種長度比較的情況,不同的情況處理方式不一樣。當字串hay...

LeetCode 實現 歸檔一

編號 題名題解 難度更新狀態 1兩數之和 雜湊表簡單 2 兩數相加 鍊錶中等 3 無重複字元的最長子串 雜湊表中等 4 尋找兩個有序陣列的中位數 二分查詢困難5 最長回文子串 動態規劃中等 6 z 字形變換 字串中等 7 整數反轉 數學簡單 8 字串轉換整數 字串中等 9 回文數數學簡單 10正規表...