LRU快取機制實現(cpp版)

2021-10-03 05:51:59 字數 1380 閱讀 3407

計算機的快取容量有限,如果快取滿了就要刪除一些內容,給新內容騰位置。但問題是,刪除哪些內容呢?我們肯定希望刪掉哪些沒什麼用的快取,而把有用的資料繼續留在快取裡,方便之後繼續使用。那麼,什麼樣的資料,我們判定為「有用的」的資料呢?

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 如果金鑰不存在,則寫入其資料值。...