高级数据结构与算法 | LRU缓存机制(Least Recently Used)
文章目錄
- LRUCache的原理
- LRUCache的實現
LRUCache的原理
LRU是Least Recently Used的縮寫,意思是最近最少使用,它是一種Cache替換算法。 什么是
Cache?狹義的Cache指的是位于CPU和主存間的快速RAM, 通常它不像系統主存那樣使用
DRAM技術,而使用昂貴但較快速的SRAM技術。 廣義上的Cache指的是位于速度相差較大的兩種
硬件之間, 用于協調兩者數據傳輸速度差異的結構。除了CPU與主存之間有Cache, 內存與硬盤
之間也有Cache,乃至在硬盤與網絡之間也有某種意義上的Cache── 稱為Internet臨時文件夾或
網絡內容緩存等。
Cache的容量有限,因此當Cache的容量用完后,而又有新的內容需要添加進來時, 就需要挑選
并舍棄原有的部分內容,從而騰出空間來放新內容。LRU Cache 的替換原則就是將最近最少使用
的內容替換掉。其實,LRU譯成最久未使用會更形象, 因為該算法每次替換掉的就是一段時間內
最久沒有使用過的內容。
LRUCache的實現
首先需要考慮的是數據結構,需要用一個結構來保存數據,另一個來記錄使用的順序。對于記錄順序的結構,因為可能存在大量的插入以及移動,為了能夠保證其插入刪除的效率一直在O(1),所以需要用到鏈表。而為了能夠實現O(1)的查找,存儲結構需要用到哈希,并且為了能夠保證更新順序時能夠O(1)找到鏈表中對應的結點,還需要保存其迭代器作為哈希的value。
具體的思路我都寫在了注釋中
#include<unordered_map> #include<list>using namespace std;class LRUCache { public:LRUCache(size_t capacity): _capacity(capacity){}int get(int key) {auto ret = _hashmap.find(key);//查找成功if (ret != _hashmap.end()){//獲取數據的位置list<pair<int, int>>::iterator pos = ret->second;pair<int, int> kv = *pos;//將數據移動到隊首_lrulist.erase(pos);_lrulist.push_front(kv);ret->second = _lrulist.begin();return kv.second;}//查找失敗返回-1else{return -1;}}void put(int key, int value) {//首先判斷數據是否存在,來判定是插入還是更新auto ret = _hashmap.find(key);//如果數據存在,則是更新if (ret != _hashmap.end()){list<pair<int, int>>::iterator pos = ret->second;_lrulist.erase(pos);_lrulist.push_front(make_pair(key, value));ret->second = _lrulist.begin();}//不存在則是刪除else{//數據已滿if (_lrulist.size() == _capacity){//刪除最久未使用的數據pair<int, int> back = _lrulist.back();_lrulist.pop_back();_hashmap.erase(back.first);}//插入數據_lrulist.push_front(make_pair(key, value));_hashmap.insert(make_pair (key, _lrulist.begin()));}}private://利用哈希表來存儲數據以及迭代器,來實現o(1)的get和putunordered_map<int, list<pair<int, int>>::iterator> _hashmap;//利用雙向鏈表來保存緩存使用情況,并保證o(1)的插入刪除list<pair<int, int>> _lrulist;size_t _capacity; };總結
以上是生活随笔為你收集整理的高级数据结构与算法 | LRU缓存机制(Least Recently Used)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高级数据结构与算法 | 并查集(Unio
- 下一篇: MySQL(一): 数据类型、库的操作、