日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高级数据结构与算法 | LRU缓存机制(Least Recently Used)

發布時間:2024/4/11 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高级数据结构与算法 | 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。

//利用哈希表來存儲數據以及迭代器,來實現o(1)的查找 unordered_map<int, list<pair<int, int>>::iterator> _hashmap; //利用雙向鏈表來保存緩存使用情況,并保證o(1)的插入刪除 list<pair<int, int>> _lrulist; size_t _capacity;

具體的思路我都寫在了注釋中

#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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。