博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Leetcode LRU Cache
阅读量:4984 次
发布时间:2019-06-12

本文共 2214 字,大约阅读时间需要 7 分钟。

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.

set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

LRU是近期最少使用算法,其一个例子为:

假设 序列为 4 3 4 2 3 1 4 2
物理块有3个 则
首轮 4调入内存 4
次轮 3调入内存 3 4
之后 4调入内存 4 3
之后 2调入内存 2 4 3
之后 3调入内存 3 2 4
之后 1调入内存 1 3 2(因为最少使用的是4,所以丢弃4)
之后 4调入内存 4 1 3(原理同上)
最后 2调入内存 2 4 1
 
对于
set(key, value) ,
如果不存在该cache
  如果cache已经达到了它的容量,则把最近最少使用的cache删除,然后插入新的cache
  否则直接插入新的cache
如果存在该cache
  将该cache移动到前面,表示刚被使用
 
对于get(key),
如果不存在该cache,则返回-1
否则将该cache移动到前面,表示刚被使用
 
由于涉及到查找,由于hash_map的查找时间复杂度为O(1),故考虑用hash_map
由于涉及到插入和删除,由于链表的插入删除时间复杂度为O(1),故考虑用list
故将hash_map和list相结合
class LRUCache{public:    typedef pair
CacheItem; typedef list
::iterator CacheItemIterator; typedef unordered_map
::iterator > CacheMap; typedef CacheMap::iterator CacheMapIterator; LRUCache(int capacity){ m_capacity = capacity; } int get(int key){ if(m_map.find(key) == m_map.end()) return -1; else{ moveToFirst(key); return m_map[key]->second; } } void set(int key, int value){ if(m_map.find(key) == m_map.end()){ if(m_cache.size() >= m_capacity){ m_map.erase(m_cache.back().first); m_cache.pop_back(); } m_cache.push_front(CacheItem(key,value)); m_map[key]=m_cache.begin(); }else{ m_map[key]->second = value; moveToFirst(key); } } void moveToFirst(int key){ CacheItemIterator itemIter = cacheMap[key]; m_cache.erase(itemIter); m_cache.push_front(*itemIter); m_map[key] = m_cache.begin(); } private: int m_capacity; CacheMap m_map; list
m_cache; };

 

 

转载于:https://www.cnblogs.com/xiongqiangcs/p/3795003.html

你可能感兴趣的文章
差一点搞混了Transactional注解
查看>>
javascript基本函数
查看>>
C#转义字符
查看>>
前端公共库cdn服务推荐//提高加载速度/节省流量
查看>>
python openpyxl内存不主动释放 ——关闭Excel工作簿后内存依旧(MemoryError)
查看>>
snprintf 返回值陷阱 重新封装
查看>>
asp.net GridView多行表头的实现,合并表头
查看>>
C#套打
查看>>
codeforce 932E Team Work(第二类斯特林数)
查看>>
PolyCluster: Minimum Fragment Disagreement Clustering for Polyploid Phasing 多聚类:用于多倍体的最小碎片不一致聚类...
查看>>
【每日进步】July 2012
查看>>
Cookie登录保存
查看>>
327 作业
查看>>
sql 取汉字首字母
查看>>
python3 字符串属性(四)
查看>>
javascript 封装ajax(多版本)
查看>>
bzoj4034: [HAOI2015]树上操作(树剖)
查看>>
android-Activity
查看>>
${sessionScope.user}的使用方法
查看>>
IOS断点下载
查看>>