LRU Cache
来源:互联网 发布:澳洲大学申请时间 知乎 编辑:程序博客网 时间:2024/05/16 02:09
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.
思路1:用哈希
import java.util.HashMap;import java.util.Map.Entry;import java.util.TreeMap;public class LRUCache {private static int idx = 0; class Node {Integer order; Integer v; // v is value public Node(int key, int value) { order = key; v = value;} } private TreeMap<Integer, Integer> cacheIndex = new TreeMap<Integer, Integer>();// id -> key private HashMap<Integer, Node> cache = new HashMap<Integer, Node>(); // key -> Node private int capacity; public LRUCache(int capacity) { this.capacity = capacity; } public int get(int key) { if(cache.containsKey(key)) { return update(key).v; } return -1; } public void set(int key, int value) { if(cache.size() >= capacity && !cache.containsKey(key)) { Entry<Integer, Integer> first = cacheIndex.firstEntry(); cacheIndex.remove(first.getKey()); cache.remove(first.getValue()); } if(cache.containsKey(key)) { Node node = update(key); node.v = value; } else { addNode(key, value); } } // create a new node and add to cache private void addNode(int key, int value) { ++LRUCache.idx; Node node = new Node(LRUCache.idx, value); cache.put(key, node); cacheIndex.put(LRUCache.idx, key); } // return the node by key private Node update(int key) { ++LRUCache.idx; Node node = cache.get(key); cacheIndex.remove(node.order); node.order = LRUCache.idx; cacheIndex.put(LRUCache.idx, key); return node; }}
思路2:
用链表,借用这里。
public class LRUCache {class Node {int key;int value;Node pre;Node next;public Node(int key, int value) {this.key = key;this.value = value;}}private int capacity;private HashMap<Integer, Node> map = new HashMap<Integer, Node>();private Node head = null;private Node end = null;public LRUCache(int capacity) {this.capacity = capacity;}public int get(int key) {if (map.containsKey(key)) {Node n = map.get(key);remove(n);setHead(n);return n.value;}return -1;}private void remove(Node n) {if (n.pre != null) {n.pre.next = n.next;} else {head = n.next;}if (n.next != null) {n.next.pre = n.pre;} else {end = n.pre;}}private void setHead(Node n) {n.next = head;n.pre = null;if (head != null)head.pre = n;head = n;if (end == null)end = head;}public void set(int key, int value) {if (map.containsKey(key)) {Node old = map.get(key);old.value = value;remove(old);setHead(old);} else {Node created = new Node(key, value);if (map.size() >= capacity) {map.remove(end.key);remove(end);setHead(created);} else {setHead(created);}map.put(key, created);}}}
0 0
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- lru cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU cache
- LRU Cache
- LRU Cache
- LRU Cache
- LRU Cache
- leetcode笔记:Add Binary
- linux在线安装软件
- 黑马程序员Java学习笔记之正则表达式
- JS基本类型和引用类型的值
- angularjs install for window
- LRU Cache
- Java集合---List
- 数据结构——线索二叉树
- iGrimaceV8在线源安装
- cocos2d-x开发日志06 —— 菜单制作
- hdu1541-Stars(树状数组)
- GDOI2016模拟8.15总结
- 利用Bmob公司的云服务实现获取短信验证码登录操作
- Codeforces 6D