最近最少使用置换算法:当缓存满时,移除最近最少使用的数据 算法思路:利用哈希链表的有序性,将数据按最后使用时间排序
- 使用哈希表存储数据,实现查找和插入数据的时间复杂度都为O(1)
- 使用双向链表来实现算法逻辑
- 当数据被访问时,移动该数据到链表头部
- 缓存满时,删除链表尾部数据

#include <iostream>#include <list>#include <unordered_map>using namespace std;#define PII pair<int, int>class LRUCache {public:LRUCache(int n) : capacity(n) {}int get(int key) {/*当数据被访问时,将数据移动到链表头部- 在map中查找,如有,根据it将PII移动到list首部*/auto it_mp = mp.find(key);if (it_mp == mp.end()) return -1;auto it_list = it_mp->second;// 拷贝被访问的PII到链表头部PII tmp {it_list->first, it_list->second};cache.push_front(tmp);// 删除原有PII,更新map中的itcache.erase(it_list);mp.erase(it_mp);mp.emplace(key, cache.begin());return tmp.second;}int put(int key, int value) {/*if原有key -> 删除原有数据,将新数据插入链表头部if新数据 -> 将数据插入链表头部- if容量满,删除尾部数据*/auto it_mp = mp.find(key);if (it_mp != mp.end()) {cache.erase(it_mp->second);mp.erase(it_mp);}PII tmp {key, value};cache.push_front(tmp);mp.emplace(key, cache.begin());if (cache.size() > capacity) {// 先清map中数据mp.erase(cache.back().first);cache.pop_back();}}private:size_t capacity;/*双向链表实现算法逻辑- 最近访问的数据移动到链表头部- 缓存满时,删除链表尾部数据*/list<PII> cache;// 哈希表存储数据,实现查找和插入效率O(1)unordered_map<int, list<PII>::iterator> mp;};int main() {LRUCache *lru = new LRUCache(2);lru->put(1, 1);lru->put(2, 2);cout << lru->get(1) << endl;lru->put(3, 3);cout << lru->get(2) << endl; // -1lru->put(4, 4);cout << lru->get(1) << endl; // -1cout << lru->get(3) << endl;cout << lru->get(4) << endl;delete lru;return 0;}
