計算機的快取容量有限,如果快取滿了就要刪除一些內容,給新內容騰位置。但問題是,刪除哪些內容呢?我們肯定希望刪掉哪些沒什麼用的快取,而把有用的資料繼續留在快取裡,方便之後繼續使用。那麼,什麼樣的資料,我們判定為「有用的」的資料呢?
lru 快取淘汰演算法就是一種常用策略。lru 的全稱是 least recently used,即最近最少被使用,也就是說我們認為最近使用過的資料應該是是「有用的」,很久都沒用過的資料應該是無用的,記憶體滿了就優先刪那些很久沒用過的資料。
獲取資料 get 和 寫入資料 put 。
獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。
寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。
要讓 put 和 get 方法的時間複雜度為 o(1)o(1),我們可以總結出 cache 這個資料結構必要的條件:查詢快,插入快,刪除快,有順序之分。
因為顯然 cache 必須有順序之分,以區分最近使用的和久未使用的資料;而且我們要在 cache 中查詢鍵是否已存在;如果容量滿了要刪除最後乙個資料;每次訪問還要把資料插入到隊頭。
那麼,什麼資料結構同時符合上述條件呢?雜湊表查詢快,但是資料無固定順序;鍊錶有順序之分,插入刪除快,但是查詢慢。所以結合一下,形成一種新的資料結構:雜湊鍊錶。
lru 快取演算法的核心資料結構就是雜湊鍊錶,雙向鍊錶和雜湊表的結合體。
#include
#include
#include
#include
using
namespace std;
class
lrucache
intget
(int key)
}void
put(
int key,
int value)
//再插入
cache.
push_front()
; map[key]
= cache.
begin()
;}//key已經存在
else);
map[key]
= cache.
begin()
;}}protected
: listint,
int>> cache;
unordered_map <
int, listint,
int>>
::iterator> map;};
void
main()
以上就是本篇文章的全部內容,如有不足,請多批評指正。 LRU快取機制實現
題目描述 設計lru快取結構,該結構在構造時確定大小,假設大小為k,並有如下兩個功能 set key,value 將記錄 key,value 插入該結構 get key 返回key對應的value值 要求 set和get方法的時間複雜度為o 1 某個key的set或get操作一旦發生,認為這個key...
LRU快取機制演算法實現
就是一種快取淘汰策略。計算機的快取容量有限,如果快取滿了就要刪除一些內容,給新內容騰位置。但問題是,刪除哪些內容呢?我們肯定希望刪掉哪些沒什麼用的快取,而把有用的資料繼續留在快取裡,方便之後繼續使用。那麼,什麼樣的資料,我們判定為 有用的 的資料呢?lru 快取淘汰演算法就是一種常用策略。lru 的...
LRU快取機制
運用你所掌握的資料結構,設計和實現乙個 lru 最近最少使用 快取機制。它應該支援以下操作 獲取資料 get 和 寫入資料 put 獲取資料 get key 如果金鑰 key 存在於快取中,則獲取金鑰的值 總是正數 否則返回 1。寫入資料 put key,value 如果金鑰不存在,則寫入其資料值。...