牛客 設計LRU快取結構(map和鍊錶)

2021-10-24 08:40:53 字數 2114 閱讀 6220

[本題鏈結]

題目描述設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 set(key, value):將記錄(key, value)插入該結構 get(key):返回key對應的value值

要求set和get方法的時間複雜度為o(1) 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。 當快取的大小超過k時,移除最不經常使用的記錄,即set或get最久遠的。 若opt=1,接下來兩個整數x, y,表示set(x, y)

若opt=2,接下來乙個整數x,表示get(x),若x未出現過或已被移除,則返回-1 對於每個操作2,輸出乙個答案

示例1輸入 [[1,1,1],[1,2,2],[1,3,2],[2,1],[1,4,4],[2,2]],3 輸出 [1,-1]

說明第一次操作後:最常使用的記錄為(「1」, 1) 第二次操作後:最常使用的記錄為(「2」, 2),(「1」, 1)變為最不常用的 第三次操作後:最常使用的記錄為(「3」, 2),(「1」, 1)還是最不常用的 第四次操作後:最常用的記錄為(「1」, 1),(「2」,

2)變為最不常用的 第五次操作後:大小超過了3,所以移除此時最不常使用的記錄(「2」, 2),加入記錄(「4」,

4),並且為最常使用的記錄,然後(「3」, 2)變為最不常使用的記錄』

思路解析

本題是乙個模擬lru快取結構的問題,lru也是在選擇題中經常出現的考點,首先要明白lru的機制,即最近最少使用,是一種常用的頁面置換演算法,選擇最近最久未使用的頁面予以淘汰。

解題思路

首先本題考查了對於常用知識點的考查,我們要明白lru演算法的呼叫機制,然後分析題意,來實現其set和get方法。

1.通過觀察輸入的測試用例,我們可以看出其,二維陣列中每一行第乙個元素表示的是要呼叫的方法,「1」為set,"2"為get.

2.set方法實現,我們可以通過題目描述觀察出其傳參模式為key,value模型,我們可聯想到通過關聯式容器map來進行管理。

set的實現原理,若set中的key在原來lru中存在,則直接刪除,插入新的key,value。

當呼叫set方法時,觸發了一次lru,lru結構通過鍊錶管理,當達到大小k時,最少被使用,也就是鍊錶尾部將被刪除,其在map上的節點對應刪除,最近使用key,value被插值鍊錶頭部,map中插入新的key,value。

3.get方法實現,我們通過其對應的可以key找到對應的value,如果找不到則返回-1,若存在則輸出其key對應的value。

呼叫get方法,也觸發一次lru,則刪除lru中原來位置的key,value,由於被使用,則其插入到鍊錶頭部。

#include

class

solution

else

if(opt[0]

==2)}

return res;

}void

set(

int key,

int value)

if(l.

size()

== caps)

l.push_front()

; maps[key]

= l.

front()

.second;

return;}

void

get(

int key)

l.remove()

; l.

push_front()

; res.

push_back

(maps[key]);

return;}

private

:int caps;

unordered_map<

int,

int> maps;

listint,

int>> l;

vector<

int> res;

};

注意鍊錶這裡使用remove,remove傳值刪除,要區別與erase傳迭代器刪除。

牛客刷題 設計LRU快取結構

題目 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。當快取的大小超過k時,移除最不經常使用的記錄,即set或get最久遠的。若opt 1,接下來兩個...

牛客NC93 設計LRU快取結構

設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key的記錄成了最常使用的。當快取的大小超過k時,移除最不經常使用的記錄,即set或get最久遠的。若opt 1,接下來兩個整數x...

牛客網 高頻面試題 設計LRU快取結構

設計lru快取結構 牛客網 示例1 輸入 1 1,1 1 2,2 1 3,2 2 1 1,4 4 2,2 3 返回值 1,1 說明 第一次操作後 最常使用的記錄為 1 1 第二次操作後 最常使用的記錄為 2 2 1 1 變為最不常用的 第三次操作後 最常使用的記錄為 3 2 1 1 還是最不常用的 ...