lru是頁面置換演算法的其中乙個,是一種最近最少使用的快取機制,它支援以下操作我們使用o(1)的時間複雜度完成這兩種操作獲取資料 get(key) - 如果金鑰 (key) 存在於快取中,則獲取金鑰的值(總是正數),否則返回 -1。
寫入資料 put(key, value) - 如果金鑰不存在,則寫入其資料值。當快取容量達到上限時,它應該在寫入新資料之前刪除最近最少使用的資料值,從而為新的資料值留出空間。
lrucache cache = new lrucache( 2 /* 快取容量 */ );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1); // 返回 1
cache.put(3, 3); // 該操作會使得金鑰 2 作廢
cache.get(2); // 返回 -1 (未找到)
cache.put(4, 4); // 該操作會使得金鑰 1 作廢
cache.get(1); // 返回 -1 (未找到)
cache.get(3); // 返回 3
cache.get(4); // 返回 4
思路:
使用兩個資料結構,乙個是佇列,乙個是雜湊map
確保通過佇列的結點可以找到雜湊map,通過雜湊map也可以找到佇列的結點,我們這樣定義
//pair 中的first和second我叫做 key 和value
list< pair> queue;
//m的first是key,這個key和queue中pair的key相對應,m的second的是list的迭代器
unordered_map>::iterator > m;
從上面的結構我們可以發現,通過key經過雜湊map的索引我們找到list的迭代器,通過list的迭代器我們就可以找到pair結構的second,也就是value,同樣的,在已知list的迭代器的情況下,我們可以通過迭代器中的key去索引到map的迭代器。
根據上面的敘述我們可以捋一下程式的大致流程:
set操作:
我們用乙個佇列去紀錄我們的資料使用的順序,在佇列的最尾端是最早使用的資料,也就是最近使用最少的資料。
1.當set乙個key-value後,我們首先尋找這個key是否在雜湊map中能找到,如果找到了就找到了對應list中的迭代器了,我們把list對應的那個結點調整到佇列首,表示最新使用的,並且把雜湊map中key對應的值重新指向調整後的結點
2.如果沒有找到說明要增加新資料,先判斷容量夠不夠用,如果夠用(size < cap)直接size要++,同時要向佇列中插入乙個key-value,並且雜湊map中也要生成乙個key-value指向list中的結點,如果容量(size == cap)不夠用就要淘汰最不經常使用的結點(實際上就是list中的尾結點),怎麼刪除呢? 先用list中尾結點的key值把雜湊map中的對映關係刪除掉,然後再刪除list中的尾結點,最後再新增新結點。
get操作:
get操作就是讀取對應key值對應的value值,需要做的就是每次讀取後,如果key值存在就把key值對應的list結點調整到首部,表示最新使用的,並且調整雜湊map中key對應的結點
如果key沒有對應的結點就直接返回-1即可。
class lrucache
int get(int key)
else
}void put(int key, int value)
else
}else
//重新入乙個新的鍵值對
//重新建立對映關係
ls.push_front(pair(key,value));
key_list_map[key] = ls.begin();
}int cap;
int size;
std::list< std::pair> ls;
std::unordered_map>::iterator> key_list_map;
};
頁面置換演算法之 LRU演算法
基本思想 利用區域性性原理,根據乙個作業在執行過程中過去的頁面訪問歷史來推測未來的行為。它認為過去一段時間裡不曾被訪問過的頁面,在最近的將來可能也不會再被訪問。所以,這種演算法的實質是 當需要淘汰乙個頁面時,總是選擇在最近一段時間內最久不用的頁面予以淘汰。即淘汰最近最長時間未訪問過的頁面。往前看 l...
頁面置換演算法 最近最久未使用LRU置換演算法
lru,least recently used演算法描述 選擇記憶體中最近最久未使用的頁換出。該演算法賦予每個頁乙個訪問字段,用來記錄乙個頁自上次被訪問以來所經歷的時間t。lru演算法的實現 1.暫存器 為每個記憶體中的頁配置乙個移位暫存器,可標識為r rn 1.r2r1r0 當程序訪問某頁時候,要...
快取演算法(頁面置換演算法) FIFO LFU LRU
快取演算法 頁面置換演算法 fifo lfu lru 在前一篇文章中通過leetcode的一道題目了解了lru演算法的具體設計思路,下面繼續來 一下另外兩種常見的cache演算法 fifo lfu fifo first in first out 先進先出。其實在作業系統的設計理念中很多地方都利用到了...