簡單了解一下(個人解釋)
lru快取結構:
有乙個池子,有一堆資料,池子的容納上限是k,
有兩種操作
set:放資料(如果超出上限了,刪除最晚訪問的那條資料)
get:訪問資料
牛客網**提交的鏈結
這裡有個要求:
get、set的時間複雜度都需要是o(1)
推理過程:
先考慮一下我們需要什麼樣的功能
訪問時候為1,插入刪除時為1,這樣的話,沒有乙個資料結構是可以同時符合這種特徵的
但是我們可以將兩種結構結合在一起,達到需要的效果
使用鍊錶方便插入和刪除,使用map解決鍊錶的訪問問題。
這麼說可能比較乾燥,上圖
設計實現:
使用map記錄每個節點的key值和位址
訪問的時候通過map的key值直接訪問鍊錶中的某個節點
因為map記錄的是當前節點的位址,所以單向鍊錶並不能很好的達到我們的要求,所以維護的是乙個雙向鍊錶
其實第二張圖並不是很好,因為頭和尾應該是初始就存在的節點,就像第一張圖那樣,這樣會比較方便
具體流程(見**注釋):
class
solution};
node* head =
newnode(-
1,-1
);//定義頭結點
node* tail =
newnode(-
1,-1
);//定義尾節點
int cnt =0;
//記錄鍊錶中資料的數量
int maxlen =0;
//記錄資料最大上限
map<
int, node*
>mp;
//map
solution()
//將訪問的節點放在第乙個位置
void
update
(node* p)
//插入資料
void
set(
int key,
int val)
else}}
//訪問資料
intget
(int key)
else
} vector<
int>
lru(vector
int>
>
& operators,
int k)
else
if(x[0]
==2)}
return ans;}}
;
C 簡單實現LRU快取
最近跟同學吃飯扯淡的時候,由技術扯到薪資,又由薪資扯到他找工作時跟面試官是怎麼扯淡拿高工資的,各種技術一頓侃,總之只要啥都了解就沒問題了。談到快取的時候,我試探性的問了問 你還記得lru怎麼寫嗎,他說啥完?我說沒事。寫完這篇文章發給他 鄙視完他讓他請我再吃飯,標準的快取lru實現為雜湊表 鍊錶,這是...
Lru快取的簡單實現
最近最少使用演算法設計的map快取 使用linkedhashmap特性,完成當快取超過指定容量時,擠掉最久未使用的資源。具體編寫的工具類如下 一 cache類 繼承linkedhashmap 用於儲存資料 class cache extends linkedhashmap 取得元素耗費儲存空間大小 ...
LRU簡單實現C
頁面置換演算法 在位址對映過程中,若在頁面中發現所要訪問的頁面不再記憶體中,則產生缺頁中斷。當發生缺頁中斷時作業系統必須在記憶體選擇乙個頁面將其移出記憶體,以便為即將調入的頁面讓出空間。而用來選擇淘汰哪一頁的規則叫做頁面置換演算法。下面是lru簡單實現 雙向鍊錶,時間複雜度o n include i...