package LRU;
/*
不使用LinkedListMap实现
*/
import java.util.HashMap;
import java.util.LinkedHashMap;
class Node{
public int key, val;
public Node pre, next;
public Node(int k, int v){
this.key = k;
this.val = v;
}
}
class DoubleList{
private Node head, tail;
private int size;
public DoubleList(){
head = new Node(0,0);
tail = new Node(0,0);
head.next = tail;
tail.pre = head;
size = 0;
}
//添加结点至队尾
public void addLast(Node x){
x.pre = tail.pre;
x.next = tail;
tail.pre.next = x;
tail.pre = x;
size++;
}
//删除目标结点
public void remove(Node x){
x.pre.next = x.next;
x.next.pre = x.pre;
size--;
}
//删除链表中第一个结点并返回
public Node removeFirst(){
if(head==null){
return null;
}else{
Node first = head.next;
remove(first);
return first;
}
}
//时间复杂度为1
public int size(){
return size;
}
}
public class LRUCacheEssential {
private HashMap<Integer, Node> map ;
private DoubleList cache ;
private int cap;
public LRUCacheEssential(int cap){
this.cap = cap;
map = new LinkedHashMap<>();
cache = new DoubleList();
}
//将某个key提升为最近使用
private void makeRecently(int key){
Node x = map.get(key);
cache.remove(x);
cache.addLast(x);
}
//添加最近使用的元素
private void addRecently(int key, int val){
Node x = new Node(key,val);
cache.addLast(x);
map.put(key, x);
System.out.println("成功添加"+key+","+map.get(key).val);
}
//删除一个key
private void deleteKey(int key){
Node x = map.get(key);
cache.remove(x);
map.remove(key);
}
//删除最久没有使用的
private void removeLeastRecently(){
Node x=cache.removeFirst();
map.remove(x.key);
System.out.println("删除数据"+x.key);
}
public int get(int key){
if(!map.containsKey(key)){
return -1;
}
makeRecently(key);
return map.get(key).val;
}
public void put(int key, int val){
if(map.containsKey(key)){
deleteKey(key);
addRecently(key,val);
System.out.println("更改数据");
return;
}
if(cap == cache.size()){
removeLeastRecently();
}
addRecently(key,val);
}
public static void main(String[] args) {
LRUCacheEssential lru = new LRUCacheEssential(5);
lru.put(0,1);
lru.put(1,1);
lru.put(2,1);
lru.put(3,1);
lru.put(4,1);
lru.put(5,1);
lru.put(2,3);
lru.put(0,1);
}
}
LRU算法实现
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 一、redis的缓存淘汰策略 1、redis的缓存淘汰策略回收策略 noeviction:返回错误当内存限制达到并...
- 本文主要介绍了Nodejs基于LRU算法实现的缓存处理操作,结合具体实例形式分析了LRU算法的原理、功能以及n...
- 本文首发于 LOGI'S BLOG,由作者转载。 在使用页进行内存管理的操作系统中,当新页进入内存且内存已满时,需...