方法一:雙雜湊表法
題目要求需要在常數時間完成插入和查詢演算法,聯絡之前的lru演算法,很容易想到用雜湊表。具體做法如下:
第乙個雜湊表儲存 使用頻率freq和乙個雙向鍊錶這樣一對對映,鍊錶的每個節點儲存key value
和freq
(使用頻率);
第二個雜湊表儲存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正規表...