java实现简单的LRU Cache
2014-09-22 23:03
369 查看
题目来源https://oj.leetcode.com/problems/lru-cache/
我第一次的实现思路是为每个键值对记录下访问时间,然后删除时遍历访问时间来删除,显然这样的效率不高
看了网上的讨论,用双向链表来维护访问的顺序比较好,于是给出下面的实现
我第一次的实现思路是为每个键值对记录下访问时间,然后删除时遍历访问时间来删除,显然这样的效率不高
public class LRUCache { private int cap; private HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(); private HashMap<Integer,Long> tmap = new HashMap<Integer,Long>(); public LRUCache(int capacity) { this.cap = capacity; } public int get(int key) { Integer i = map.get(key); if(i == null) return -1; else { tmap.put(key,System.nanoTime()); return i; } } public void set(int key, int value) { map.put(key,value); tmap.put(key,System.nanoTime()); if(map.size() > this.cap) { long oldvalue = Long.MAX_VALUE; int oldkey = -1; for(Map.Entry<Integer,Long> en : tmap.entrySet()) { if(en.getValue() < oldvalue) { oldvalue = en.getValue(); oldkey = en.getKey(); } } map.remove(oldkey); tmap.remove(oldkey); } } }
看了网上的讨论,用双向链表来维护访问的顺序比较好,于是给出下面的实现
class LRUCache { private int cap; private HashMap<Integer,Item> map = new HashMap<Integer,Item>(); private Item sen; public LRUCache(int capacity) { this.cap = capacity; sen = new Item(null,null); sen.pre = sen; sen.next = sen; } static class Item { public Item(Integer k, Integer v) { this.key = k; this.value = v; } public Integer key; public Integer value; public Item pre; public Item next; } private void removeItem(Item i) { i.pre.next = i.next; i.next.pre = i.pre; } private void insertItem(Item i) { i.next = sen.next; sen.next.pre = i; i.pre = sen; sen.next = i; } private void movetoHead(Item i) { removeItem(i); insertItem(i); } public int get(int key) { Item i = map.get(key); if(i == null) return -1; else { movetoHead(i); return i.value; } } public void set(int key, int value) { Item i = map.get(key); if(i == null) { i = new Item(key,value); map.put(key, i); insertItem(i); } else { i.value = value; movetoHead(i); } if(map.size() > this.cap) { Item re = sen.pre; removeItem(re); map.remove(re.key); } } }
相关文章推荐
- 使用Java实现对dbf文件的简单读写
- 基于Java实现简单Http服务器之一
- 用java实现简单url负载均衡以及容错
- 在java中实现调用简单的c程序
- 由Java实现简单的文本编辑器
- http断点续传简单实现(java)
- 一个简单的冒泡排序和快速排序算法java实现
- 基于Java实现简单Http服务器之一
- JSP应用 java反射简单实现
- 用Java简单实现文件分割与合并
- 用java实现简单的email正则表达式判断
- 用java实现简单的多线程下载
- 一个简单的用JAVA实现的屏幕抓图(源代码)
- 用java实现简单的网络通信,相当于一个最简单的控制台qq(附代码) 推荐
- 使用异或进行简单的密码加密(JAVA实现)
- 今天的问题:一个简单的例子,请帮我解开“接口实现Java‘隐藏实现细目’”的迷惑。
- 用Java简单实现文件分割与合并
- 用Java实现的字符串简单加密
- http断点续传简单实现(java)
- Java程序国际化的简单实现