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

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

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 cache, 采用“如果满则淘汰最近未使用的项目“的策略,所以需要一个序列,每次插入的项目放入序列首,被查找的项目也移至序列首。如果超过数量上限则删除序列最后的项目。查找,插入操作都需要O(1)的时间复杂度,否则超时通不过。所以这个序列可以是链表,并且为了查找快捷,需要结合HashMap。由于涉及到转移项目操作,需要双向链表。

HashMap用于把查找键key和具体项目联系起来,这样就能直接获得项目,然后将其移至链表首位。

需要注意的是set操作中,如果set的key已经存在了,那就相当于一次查找操作加上修改其值和HashMap的操作。

代码如下:

1 class Node 2     { 3         int key; 4         int value; 5         Node next; 6         Node front; 7         Node(int k, int v) 8         { 9             key=k;10             value=v;11             next=null;12             front=null;13         }14     }15     16     private HashMap
hs;17 private Node head;18 private Node tail;19 private int cap;20 public LRUCache(int capacity) {21 hs = new HashMap
();22 head = null;23 cap = capacity;24 tail = null;25 }26 27 public int get(int key) {28 Node re = hs.get(key);29 if(re==null)30 return -1;31 if(re.front==null)32 return re.value;33 re.front.next = re.next;34 if(re.next!=null)35 re.next.front = re.front;36 else37 tail = re.front;38 re.front = null;39 re.next = head;40 head.front = re;41 head = re;42 return re.value;43 }44 45 public void set(int key, int value) {46 Node temp = hs.get(key);47 if(temp!=null)48 {49 get(key);50 head.value = value;51 hs.put(key,head);52 }53 else54 {55 temp = new Node(key, value);56 temp.next = head;57 if(head!=null)58 head.front = temp;59 head = temp;60 if(hs.size()==0)61 tail = temp;62 hs.put(key, temp);63 if(hs.size()>cap)64 {65 hs.remove(tail.key);66 tail.front.next = null;67 tail = tail.front;68 }69 }70 }

 

转载于:https://www.cnblogs.com/splash/p/4002959.html

你可能感兴趣的文章
File,FileStream,byte[]3者互相转换总结(转)
查看>>
springboot 使用devtools 实现热部署
查看>>
Yahoo网站性能最佳体验的34条黄金守则
查看>>
forward与redirect的区别
查看>>
网络编程之socket
查看>>
Maven pom项目部署
查看>>
Cognos报表验证(添加字段)
查看>>
学术-物理-维空间:一维空间
查看>>
CSS:CSS 实例
查看>>
innodb的存储结构
查看>>
焦点控制
查看>>
python-文件读写操作
查看>>
P1129 [ZJOI2007]矩阵游戏 二分图匹配
查看>>
Git 内部原理之 Git 对象哈希
查看>>
Vue中引入TradingView制作K线图
查看>>
爱历史 - 朝代歌
查看>>
【笔记】Cocos2dx学习笔记
查看>>
PHP设计模式之:单例模式
查看>>
c++输出缓冲区刷新
查看>>
Linux查看CPU和内存使用情况总结
查看>>