LRU为最近最少使用算法,可以类比为手机app多任务管理来理解,每个app刚用完在会被放在最前面,当内存满时,最久没用的app内存会被释放,题目链接如下:
Leetcode 146-LRU缓存机制
题目要求:
put和get操作时间复杂度为O(1)
分析:
- 首先,这些key-value的数据应该按时间顺序排列,链表是有序的;但链表查询时间为O(n),无法满足要求;
- 哈希表查询时间为O(1),但是无序的。
因此可以用哈希表来存储key和链表节点指针的映射;
每次最新访问或存储的数据放在链表的头部,当cache容量满时删掉链表尾部的节点
- 查询:哈希表存储key和链表节点指针的映射,可以以O(1)时间查到某个key对应的数据是否存在
- 插入:在链表头部插入,时间为O(1)
- 删除:对于链表来说,删除就是改变节点指针的关系并释放该节点内存,为了避免需要O(n)时间找到前节点,应使用双向链表;同时,删除最不常使用的节点时,也要删除cache哈希表中的value,这需要知道该节点的key,因此链表中不仅要存value,也要存key。
①双向链表实现代码如下:
typedef struct DListNode{
int key;
int val;
DListNode* next;
DListNode* pre;
DListNode():key(0),val(0),next(nullptr),pre(nullptr){
}
DListNode(int _key,int _val):key(_key),val(_val),next(