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。所...