46. LRU 缓存
LRU 算法就是一种缓存淘汰策略,计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?
- LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。
- 我们使用LinkedHashMap这个数据结构来实现,因为题目要求我们的get和put的时间复杂度要是o(1)
- LinkedHashMap就是带着链式双链表的HashMap,为了解决HashMap的无序
class LRUCache { int cap; LinkedHashMap<Integer,Integer> cache=new LinkedHashMap<>(); public LRUCache(int capacity) { this.cap=capacity; } public int get(int key) { if(!cache.containsKey(key)){ return -1; } makeRecently(key); return cache.get(key); } public void put(int key, int value) { if(cache.containsKey(key)){ //修改key的值 cache.put(key,value); makeRecently(key); return; } if(cache.size()>=this.cap){ //链表的头部就是最久未使用的 int oldsetKey=cache.keySet().iterator().next(); cache.remove(oldsetKey); } cache.put(key,value); } private void makeRecently(int key){ int val=cache.get(key); //删除key,重新插入到队尾 cache.remove(key); cache.put(key,val); } } /** * Your LRUCache object will be instantiated and called as such: * LRUCache obj = new LRUCache(capacity); * int param_1 = obj.get(key); * obj.put(key,value); */
LRU的构造
最新推荐文章于 2024-08-16 23:08:28 发布