提示
LintCode中的相关算法题实现代码,可以在我的GitHub中下载。
题目需求
描述
为最近最少使用(LRU)缓存策略设计一个数据结构,它应该支持以下操作:获取数据(get)和写入数据(set)。
获取数据get(key):如果缓存中存在key,则获取其数据值(通常是正数),否则返回-1。
写入数据set(key, value):如果key还没有在缓存中,则写入其数据值。当缓存达到上限,它应该在写入新数据之前删除最近最少使用的数据用来腾出空闲位置。
解题思路
LRU是最近最少算法,可以继承LinkedHashMap。
实现代码
public class LRUCache {
class CacheNode
{
int key;
int value;
CacheNode prev;
CacheNode next;
}
private int curSize;
private int size;
Hashtable<Integer,CacheNode> nodes;
CacheNode head;
CacheNode tail;
/*
* @param capacity: An integer
*/public LRUCache(int capacity) {
// do intialization if necessary
curSize=0;
size=capacity;
head=tail=null;
nodes=new Hashtable(size);
}
/*
* @param key: An integer
* @return: An integer
*/
public int get(int key) {
// write your code here
CacheNode node=nodes.get(key);
if(node==null) return -1;
int value=node.value;
moveToHead(node);
return value;
}
private void moveToHead(CacheNode node)
{
if(head==node) return;
if(node.prev!=null)
{
node.prev.next=node.next;
}
if(node.next!=null)
{
node.next.prev=node.prev;
}
if(node==tail)
{
tail=node.prev;
}
node.next=head;
node.prev=null;
if(head!=null)
{
head.prev=node;
}
head=node;
if(tail==null) tail=head;
}
/*
* @param key: An integer
* @param value: An integer
* @return: nothing
*/
public void set(int key, int value) {
// write your code here
CacheNode node=nodes.get(key);
if(node==null)
{
if(curSize>=size)
{
if(tail!=null) nodes.remove(tail.key);
moveTail();
}
else curSize++;
node =new CacheNode();
}
node.key=key;
node.value=value;
nodes.put(key,node);
moveToHead(node);
}
private void moveTail()
{
if(tail!=null)
{
if(tail.prev!=null)
{
tail.prev.next=tail.next;
}
else head=null;
tail=tail.prev;
}
}
}