運用你所掌握的資料結構,設計和實現乙個 lru (最近最少使用) 快取機制。它應該支援以下操作: 獲取資料get
和 寫入資料put
。
獲取資料get(key)
- 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。
寫入資料put(key, value)
- 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。
高階:
你是否可以在o(1)時間複雜度內完成這兩種操作?
示例:
lrucache cache = new lrucache( 2 /* 快取容量 */ );解題思路: 時間複雜度為o(1)的話,可以使用hashmap key為key, value為雙向鍊錶節點, 每次put和get都會將對應對應節點放置到煉表頭,每次刪除節點都刪除鍊錶尾節點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
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 詳解 時間複...