演算法題 LFU快取

2021-10-04 19:00:58 字數 2284 閱讀 5857

題目:

設計並實現最不經常使用(lfu)快取的資料結構。它應該支援以下操作:get 和 put。

get(key) - 如果鍵存在於快取中,則獲取鍵的值(總是正數),否則返回 -1。

put(key, value) - 如果鍵不存在,請設定或插入值。當快取達到其容量時,它應該在插入新專案之前,使最不經常使用的專案無效。在此問題中,當存在平局(即兩個或更多個鍵具有相同使用頻率)時,最近最少使用的鍵將被去除。

高階:你是否可以在 o(1) 時間複雜度內執行兩項操作?

示例: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

解題思路:

用了當初作業系統課程設計的大概思路實現的lfu,陣列存值的方式,不是最優解

判斷快取中是否已存在對應的key,存在則進行訪問記錄資料、快取值更新

新增快取中未存在的值,則先判斷當前快取容量是否已經滿了,如果當前快取容量滿了,則要先通過lfu進行資料淘汰操作。

插入新的快取值

淘汰資料方法思路

遍歷先存在的所有快取

通過對比每個快取項的訪問時間,以及最後一次訪問時間決定淘汰資料的鍵值

(1)找出訪問次數最少的cacheitem、cache key

(2)如果訪問次數最少的快取鍵存在多個,則通過每個快取cacheitem最後訪問時間判斷哪個是最久沒進行訪問過的,也就是最後一次訪問時間是最早最小的,決定最後淘汰快取key

將遍歷篩選出來需要淘汰的快取key,從快取map中進行delete操作,即刪除淘汰快取

說明下需要更新訪問資訊的兩種情況

優化大概思路

通過雜湊表以及雙向鍊錶維護乙個插入時間有序的資料結構,因為雙向鍊錶中刪除、插入乙個節點的時間複雜度都是o(1),在進行資料淘汰的時候,可直接刪除有序鍊錶中的head或tail node實現資料淘汰,降低put操作時間複雜度。

go解題**:

type cacheitem struct

type lfucache struct

func

constructor

(capacity int

) lfucache

}func

(this *lfucache)

get(key int

)int

else

}func

(this *lfucache)

put(key int

, value int

) this.time++

//命中快取

if this.cachemap[key]

!=nil

//命中快取無需進行下續淘汰,新增操作,直接返回

return}if

len(this.cachemap)

>= this.capacity

for k, v :=

range this.cachemap

else

if v.visittimes == eliminatecache.visittimes && v.visittime < eliminatecache.visittime

}if eliminatekey !=-1

}//新插入資料

this.cachemap[key]

=&cacheitem

}

時間複雜度

get:o(1)

put:o(capacity)

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

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

Leetcode刷題 LFU快取

題目 思路 o 1 的資料結構 hashmap 維持最近使用 orderddict 詳見lru快取問題 使用乙個hashmap維繫key到出現頻率的對映關係 另乙個hashmap維繫頻率到資料 key value鍵值對 的關係 由於 當存在平局 即兩個或更多個鍵具有相同使用頻率 時,應該去除 最近 ...

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