LRU 演算法底層資料結構實現原理

2021-10-05 18:49:49 字數 1798 閱讀 4085

前奏:如果 cpu 訪問的頁面不在記憶體中,則作業系統需要進行置換出記憶體中的頁面,然後把需要訪問的頁面從磁碟中置換到記憶體中,而這種演算法最常見的就是 lru 演算法,lru 演算法也被稱最近最少使用演算法.

假如現在有乙個需求,公司需要抽出乙個使用者系統,向各個業務系統提供使用者的基本資訊

設計方法1:使用者資訊儲存在資料庫,但是如果每一次請求都去查詢資料庫的話,會大大的降低效能,所以可以選擇在記憶體中建立乙個雜湊表,每次先去雜湊表中查詢,如果找不到再去資料庫查詢.

這種方法確實可以提高效能,但是記憶體大小有限,如果使用者的數量越來越多,記憶體一旦溢位,可能會造成伺服器的奔潰,所以我們可以考慮在記憶體的雜湊表內刪除一些不常用的使用者資訊

lru 演算法的思想是:長期不被使用的資料,在未來被用到的機率也不大,因此當占用記憶體達到乙個閥值時,就刪除不常使用的資料

資料結構:雜湊鍊錶

在雜湊鍊錶中,key 和 value 具有固定的排列順序,就像雙向鍊錶一樣,每乙個鍵值對都有乙個前驅,乙個後驅.

如果訪問乙個資料,首先檢視雜湊鍊錶中是否存在,如果存在則把它刪除,然後新增到雜湊鍊錶的尾部,如果要查詢的元素不存在雜湊鍊錶中,則進行資料庫的查詢,然後新增到雜湊鍊錶的尾部,這樣一來,最近最少使用的資料就在雜湊鍊錶的頭部了,然後就可以直接刪除了。

**實現

class

lrucache

intget

(int key)

// map 中存在對應的 key

pair<

int,

int>kv =

*map[key]

; cache.

erase

(map[key]);

cache.

push_front

(kv)

;// 更新

map[key]

= cache.

begin()

;return kv.second;

}void

put(

int key,

int value)

else

// 進行插入,鍊錶進行頭插,雜湊表直接插入進去

cache.

push_front

(make_pair

(key,value));

map[key]

= cache.

begin()

;}}private

:// 雙向鍊錶的作用是方便插入和刪除,以及有序

list

int,

int>>cache;

// 定義雜湊表的目的是o(1)的查詢獲取,第二個引數是迭代器

unordered_map<

int,list

int,

int>>

::iterator>map;

// 鍊錶的容量

int cap;};

/** * your lrucache object will be instantiated and called as such:

* lrucache* obj = new lrucache(capacity);

* int param_1 = obj->get(key);

* obj->put(key,value);

*/

C 底層資料結構原理

c stl 的實現 1.vector 底層資料結構為陣列 支援快速隨機訪問 2.list 底層資料結構為雙向鍊錶,支援快速增刪 3.deque 底層資料結構為乙個 控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾 中間不能 快速增刪,也支援隨機訪問 deque是乙個雙端佇列 double...

STL底層資料結構實現

c stl 的實現 1.vector 底層資料結構為陣列 支援快速隨機訪問 2.list 底層資料結構為雙向鍊錶,支援快速增刪 3.deque 底層資料結構為乙個 控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾 中間不能 快速增刪,也支援隨機訪問 deque是乙個雙端佇列 double...

C 底層資料結構實現

c stl 的實現 1.vector 底層資料結構為陣列 支援快速隨機訪問 2.list 底層資料結構為雙向鍊錶,支援快速增刪 3.deque 底層資料結構為乙個 控制器和多個緩衝區,詳細見stl原始碼剖析p146,支援首尾 中間不能 快速增刪,也支援隨機訪問 deque是乙個雙端佇列 double...