LRU 快取機制

2021-10-21 19:24:26 字數 1674 閱讀 3762

牛客lru

運用你所掌握的資料結構,設計和實現乙個 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

解法

class

lrucache

}class

doublelist

else

size++;}

// 刪除鍊錶中的 x 節點(x 一定存在)

// 由於是雙鏈表且給的是目標 node 節點,時間 o(1)

public

void

remove

(node x)

else

if(head==x)

else

if(tail==x)

else

size--;}

// 刪除鍊錶中最後乙個節點,並返回該節點,時間 o(1)

public node removelast()

// 返回鍊錶長度,時間 o(1)

public

intsize()

}private hashmap

map;

private doublelist doublelist;

private

int capacity=0;

public

lrucache

(int capacity)

public

intget

(int key)

else

}public

void

put(

int key,

int value)

else

doublelist.

addfirst

(x);

map.

put(key,x);}

}}

LRU快取機制

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

LRU快取機制

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

LRU快取機制

lru快取機制 最近最少使用 雙向鍊錶 雜湊表 不使用自帶 linkedhashmap 雙向鍊錶按照被使用的順序儲存了這些鍵值對,靠近頭部的鍵值對是最近使用的,而靠近尾部的鍵值對是最久未使用的。雜湊錶即為普通的雜湊對映 hashmap 通過快取資料的鍵對映到其在雙向鍊錶中的位置。首先使用雜湊表進行定...