146 LRU 快取機制

2021-10-21 01:27:46 字數 2231 閱讀 3052

題目描述

運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制 。

實現lrucache類:

高階:你是否可以在o(1)時間複雜度內完成這兩種操作?

示例:

輸入

["lrucache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]

[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]

輸出[null, null, null, 1, null, -1, null, -1, 3, 4]

解釋lrucache lrucache = new lrucache(2);

lrucache.put(1, 1); // 快取是

lrucache.put(2, 2); // 快取是

lrucache.get(1); // 返回 1

lrucache.put(3, 3); // 該操作會使得關鍵字 2 作廢,快取是

lrucache.get(2); // 返回 -1 (未找到)

lrucache.put(4, 4); // 該操作會使得關鍵字 1 作廢,快取是

lrucache.get(1); // 返回 -1 (未找到)

lrucache.get(3); // 返回 3

lrucache.get(4); // 返回 4

題解:雙鏈表 + 雜湊。

假設雙向鍊錶從尾部到首部使用優先順序依次遞減,那麼:

時間複雜度:o(1

)o(1)

o(1)

額外空間複雜度:o(c

apac

ity)

o(capacity)

o(capa

city

)

class

lrucache

intget

(int key)

else

return-1

;}void

put(

int key,

int value)

else);

if( lst.

size()

> max_size )}}

private

:using key_value_pair = pair<

int,

int>

;using list_iterator = list

::iterator;

size_t max_size;

list lst;

unordered_map<

int, list_iterator> hash_map;};

/*記憶體:39mb,擊敗:71.53%

*/

貼乙個手寫雙鏈表的版本,新增乙個虛擬頭節點和尾節點,方便操作。

class

dlinkednode

private

:int key, val;

dlinkednode *next,

*prev;

friend

class

lrucache;}

;class

lrucache

void _delete (

)void

remove

( dlinkednode* node )

lrucache

(int capacity)

:max_size

(capacity)

,size(0

)int

get(

int key)

}void

put(

int key,

int value)

else

}private

: dlinkednode *head,

*tail;

int max_size, size;

unordered_map<

int, dlinkednode*

> hash;};

/*記憶體:38.8mb,擊敗:94.56%

*/

146 LRU快取機制

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

146 LRU快取機制

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

146 LRU快取機制

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