146 LRU快取機制

2021-09-01 20:07:03 字數 1589 閱讀 8621

運用你所掌握的資料結構,設計和實現乙個  lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料get和 寫入資料put

獲取資料get(key)- 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。

寫入資料put(key, value)- 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。

高階:

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

示例:

lrucache cache = new lrucache( 2 /* 快取容量 */ );

cache.put(1, 1);

cache.put(2, 2);

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

cache.put(3, 3); // 該操作會使得金鑰 2 作廢

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

cache.put(4, 4); // 該操作會使得金鑰 1 作廢

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

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

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

解題思路: 時間複雜度為o(1)的話,可以使用hashmap  key為key, value為雙向鍊錶節點, 每次put和get都會將對應對應節點放置到煉表頭,每次刪除節點都刪除鍊錶尾節點

class lrucache 

public int get(int key)

getnode.flush();

return getnode.val;

}public void put(int key, int value)

if (capacity == 0)

node newnode = new node(key,value);

cache.put(key,newnode);

if (first == null)

first.pre = newnode;

newnode.next = first;

first = newnode;

capacity--;

}class node

pre = null;

next = null;

cache.remove(key);

capacity++;

}private void flush()

pre.next = next;

if(next==null)else

pre = null;

next = first;

first.pre = this;

first = this;

}node(int key, int val)

}}

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快取機制

參考 官方解答 主要思路 需要字典實現快速查詢,同時需要保證一定的順序。帶頭尾節點的雙向鍊錶可以實現快速刪除和新增頭尾節點。因為節點的屬性包括前乙個節點和後乙個節點,即使是中間的節點也可以實現快速刪除。思路1 使用ordereddict實現 可參考 python ordereddict 詳解 時間複...