leetcode 146 LRU快取機制

2021-10-02 15:44:27 字數 1384 閱讀 9505

這個題目不用多說,就是手撕lru。實現原理基本上就是雜湊表+雙向鍊錶。但是這個結構剛開始其實挺難理解的,就是如何把他們連線在一起會感覺有點亂。

其實不用想的那麼複雜,這樣想我們的既然是cache,那麼首先有個hashmap(hashtable)來儲存資料,key作為資料,但此處的value不是乙個值,而是乙個節點型別,節點定義如下:

class

node

可能會疑問,既然是map,那已經有key值了,為什麼作為value的node裡面還要存放key值呢,這個後面會說到。

然後我們會維持兩個結構,乙個是帶頭結點和尾結點的雙向鍊錶,另乙個就是hashmap,只是hashmap的值是引用的雙向煉表裡的。

然後我們會用到三個函式:

至於為什麼node裡面會儲存key,是因為當我們執行poptail()時,也要將快取中的相應資料去掉,而這個過程我們是需要對應的key值得,但是我們poptail出來的是個node,如果不儲存key值就不能從快取中刪掉了,也只能在鍊錶中刪除。

class

lrucache

}//當要淘汰節點時,淘汰的總是尾結點

private node poptail()

//刪除某乙個特定節點,它會用到覆蓋操作或者訪問操作上

private

void

removenode

(node node)

//把節點移動到頭部

private

void

movetohead

(node node)

mapcache;

//儲存資料的地方

node head, tail;

//鍊錶的首、尾

int size;

//當前容量

int capacity;

//最大容量

public

lrucache

(int capacity)

public

intget

(int key)

}public

void

put(

int key,

int value)

if(size == capacity)

node node =

newnode

(key, value)

;//刪除後再新增

cache.

put(key, node)

;movetohead

(node)

;++size;

}}

學渣帶你刷Leetcode146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰已經存在,則變更其資料值...

leetcode146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...

LeetCode 146 LRU快取機制

運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料get和 寫入資料put。獲取資料get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料put key,value 如果金鑰不存在,則寫入其資料值。當快取容量...