LRU最久未使用淘汰演算法實現

2021-10-24 18:48:40 字數 2064 閱讀 8429

lru: 缺頁置換演算法中的一種, 當容量滿的時候, 新增新的一頁,就會置換淘汰掉最久未使用的一頁。

實現:可以採用鍊錶實現: 主要是因為該演算法體現在頭部和尾部的操作居多。

因此採用雙向鍊錶為佳。 介於c++stl容器的list實現為乙個方式。

由於牽扯到判斷是否存在的問題, 因此需要遍歷查詢。 該演算法實現時間複雜度為o(n)

#include

#include

#include

using

namespace std;

//lru - 最久未使用淘汰演算法 - 採用鍊錶實現

/* 底層採用雙向鍊錶實現 - 容器是採用list實現

時間複雜度o(n)

1、list容器erase介面不提供直接刪除, 需要採用迭代器刪除

2、又要查詢。因此借鑑迭代器查詢和迭代器刪除為佳!

*/class

lrualgoritm

void

put(

int key)

else

if(size_ >= capacity_)

//插入 - 隊頭插入

data_.

push_front

(key)

; size_++;}

intget

(int key)

return-1

;}void

print()

cout << endl;

}private

:int capacity_;

//容量的大小

int size_;

//已儲存的大小

list<

int> data_;

//list雙向鍊錶

list<

int>

::iterator i***it

(int key)

begin++;}

return data_.

end();

}};

採用雙向鍊錶和雜湊表實現!

因為上述版本存在查詢元素是否存在所浪費的時間問題-導致時間複雜度為o(n)。

因此優化中心也在於查詢問題!

採用雜湊表- 構建。用於查詢是否存在問題。

雜湊表操作是o(1)操作, 這樣就可以優化。

至於為什麼value要為list容器的迭代器?

好好思考下, 因為list中erase介面只支援迭代器刪除!!!

雜湊表通過key可以獲取到對應要刪除元素的迭代器, 直接可以刪除!!!

#include

#include

#include

using

namespace std;

//優化版本

/* 雜湊表+雙向鍊錶實現

採用容器list 和 unordered_map實現

list仍然作為儲存!

雜湊表作為記錄, 提公升效率!

時間複雜度為o(1)

*/class

lrualgoritm_primary

void

put(

int value)

else

if(size_ >= capacity_)

//插入

data_.

push_front

(value)

; umap_[value]

= data_.

begin()

; size_++;}

intget

(int value)

return-1

;}void

print()

cout << endl;

}private

:int capacity_;

int size_;

list<

int> data_;

unordered_map<

int, list<

int>

::iterator> umap_;

};

LRU最近最久未使用演算法

標籤 演算法 作業系統 舉報 作業系統知識庫 c 21 作者同類文章x 作業系統學習 11 作者同類文章x 最近最久未使用演算法需要引入記憶體塊時鐘,即為每個記憶體塊設定乙個計時器,用於記錄相應記憶體塊中的頁面已經存在的時間。每次置換選出所有記憶體塊時鐘中最大者作為被置換頁面,當頁面發生置換時,將其...

C 實現LRU(最久未使用)快取演算法

lru快取演算法也叫lru頁面置換演算法,是一種經典常用的頁面置換演算法,本文將用c 實現乙個lru演算法。lru演算法實現並不難,但是要高效地實現卻是有難度的,要想高效實現其中的插入 刪除 查詢,第一想法就是紅黑樹,但是紅黑樹也是一種折中的辦法。插入 刪除效率最高當屬鍊錶,查詢效率當屬hash。所...

C 實現LRU(最久未使用)快取演算法

lru快取演算法也叫lru頁面置換演算法,是一種經典常用的頁面置換演算法,本文將用c 實現乙個lru演算法。lru演算法實現並不難,但是要高效地實現卻是有難度的,要想高效實現其中的插入 刪除 查詢,第一想法就是紅黑樹,但是紅黑樹也是一種折中的辦法。插入 刪除效率最高當屬鍊錶,查詢效率當屬hash。所...