第291天学习打卡(知识点回顾 LRU算法)
Posted doudoutj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第291天学习打卡(知识点回顾 LRU算法)相关的知识,希望对你有一定的参考价值。
知识点回顾
LRU
- LRU是最近最少使用,是一种常用的页面置换算法,选择最近最近未使用的数据予以淘汰。
public class LRUCache{
private int capacity;
private Map<Integer, ListNode>map;
private ListNode head;
private ListNode tail;
public LRUCache(int capacity){
this.capacity = capacity;
map = new HashMap<Integer, ListNode>();
head = new ListNode(-1,-1);
tail = new ListNode(-1,-1);
head.next = tail;
tail.pre = head;
}
public int get(int key){
//没有就返回-1
if(!map.containsKey(key)){
return -1;
}
//有就获取这个值 然后把它删除移动到尾部
ListNode node = map.get(key);
//这两句相当于把node的前一个和后一个节点连接 然后删除Node
node.pre.next = node.next;
node.next.pre = node.pre;
moveToTail(node);
return node.val;//这里是返回节点的值
}
public void put(int key, int value){
// 直接调用这边的get方法,如果存在,它会在get内部被移动到尾巴,不用再移动一遍,直接修改值即可
if(get(key)!=-1){
map.get(key).val = value;
return;
}
ListNode node = new ListNode(key, value);
map.put(key, node);
moveToTail(node);
if(map.size() > capacity){
map.remove(head.next.key);
head.next = head.next.next;
head.next.pre = head;
}
}
private void moveToTail(ListNode node){
//node节点的前一个节点指向了tail.pre节点 就说明node移动到了真正的尾部
node.pre = tail.pre;
tail.pre = node;
node.pre.next= node;
node.next = tail;
}
private class ListNode{
int key;
int val;
ListNode pre;
ListNode next;
public ListNode(int key, int val){
this.key = key;
this.val = val;
pre = null;
next =null;
}
}
}
以上是关于第291天学习打卡(知识点回顾 LRU算法)的主要内容,如果未能解决你的问题,请参考以下文章