当前位置:网站首页>LeetCode146. LRU cache
LeetCode146. LRU cache
2022-07-05 02:47:00 【C-position debut_ two thousand and twenty-two】
LRU Full name Least Recently Used, The least used recently , The first time I heard this concept was in the operating system course of my junior , For page replacement algorithm , For virtual page storage management services .
LRU The proposed algorithm is based on a fact , Pages that are frequently used in the previous instructions are likely to be frequently used in the next few instructions , Conversely, if you haven't used it for a long time, you think you won't use it next , This is the principle of locality
Now? LRU Algorithms are also often used as cache obsolescence strategies .
LeetCode146. LRU Cache is such a problem , It is said that this is also a common point of interview
In fact, if you understand the principle and use the right method, it is not difficult

Obviously, this cache is in order , Eliminate cache from the end of the bidirectional linked list , Add and get Methods put the node at the head , It's not difficult to follow the code thinking
public class LRUCache {
private Map<Integer, MyLinkedNode> cache = new HashMap<Integer, MyLinkedNode>();
private int capacity;// Initialize capacity
private int size;// Cache existing quantity
private MyLinkedNode head,tail;
public LRUCache(int capacity) {
this.size = 0;
this.capacity = capacity;
head = new MyLinkedNode();
tail = new MyLinkedNode();
head.next = tail;
tail.prev = head;
}
public int get(int key) {
MyLinkedNode node = cache.get(key);
if(node == null){
return -1;
}
moveToHead(node);// Every time get Just put the node into the head , It means using more
return node.value;
}
public void put(int key, int value) {
MyLinkedNode node = cache.get(key);
if(node == null){// If this node does not exist, create one and add it to the cache
MyLinkedNode newNode = new MyLinkedNode(key,value);
cache.put(key,newNode);
addToHead(newNode);
++size;
if(size > capacity){
// If the capacity exceeds, delete the tail node of the linked list
MyLinkedNode tail = deleteTail();
cache.remove(tail.key);// According to this key Index delete cache The key value in it is right
--size;
}
}else {// This key If it exists , Just modify value And move to the head
node.value = value;
moveToHead(node);
}
}
private void addToHead(MyLinkedNode node){// Add nodes to the chain header
node.prev = head;
node.next = head.next;
head.next.prev = node;
head.next = node;
}
private void moveToHead(MyLinkedNode node){// Transfer the nodes in the linked list to the head
removeNode(node);
addToHead(node);
}
private void removeNode(MyLinkedNode node){// Delete node
node.prev.next = node.next;
node.next.prev = node.prev;
}
private MyLinkedNode deleteTail(){// Delete tail node
MyLinkedNode res = tail.prev;
removeNode(res);
return res;
}
class MyLinkedNode{// Two-way list node
int key;
int value;
MyLinkedNode prev;
MyLinkedNode next;
public MyLinkedNode(){}
public MyLinkedNode(int key,int value){
this.key = key;
this.value = value;
}
}
public static void main(String[] args) {
LRUCache cache = new LRUCache(2);
cache.put(1,1);
cache.put(2, 2);
System.out.println(cache.get(1));
cache.put(3, 3);
System.out.println(cache.get(2));
cache.put(4, 4);
System.out.println(cache.get(1));
System.out.println(cache.get(3));
System.out.println(cache.get(4));
}
}When I read the comment section of this topic, someone said , Why does the customized node have key This attribute ,cache Variables are not based on key Did you save it , There is only one in the node value Is it not good?
without key If so, we need to delete the tail node when we eliminate the cache , Note that the node we deleted only dereferences the nodes in the bidirectional linked list , But this node is map Type of cache It's still real , If we don't have any nodes key What to use as an index to delete cache The key value in it is right . This is the maintenance in the user-defined linked list node key The key
边栏推荐
- Which common ports should the server open
- Avoid material "minefields"! Play with super high conversion rate
- Single line function*
- Port, domain name, protocol.
- Last words record
- ASP. Net core 6 framework unveiling example demonstration [01]: initial programming experience
- 1.五层网络模型
- Zabbix
- Devtools的简单使用
- 2021 Li Hongyi machine learning (1): basic concepts
猜你喜欢

【LeetCode】404. Sum of left leaves (2 brushes of wrong questions)
![Acwing game 58 [End]](/img/16/c55e0a7aedc354f1c739637ed13a6b.png)
Acwing game 58 [End]

端口,域名,协议。

Avoid material "minefields"! Play with super high conversion rate

Tiny series rendering tutorial

Design and practice of kubernetes cluster and application monitoring scheme

Open source SPL optimized report application coping endlessly

腾讯云,实现图片上传

Linux安装Redis
![ASP. Net core 6 framework unveiling example demonstration [01]: initial programming experience](/img/3b/0ae9fbadec5dbdfc6981f1f55546a5.jpg)
ASP. Net core 6 framework unveiling example demonstration [01]: initial programming experience
随机推荐
When to catch an exception and when to throw an exception- When to catch the Exception vs When to throw the Exceptions?
【LeetCode】110. Balanced binary tree (2 brushes of wrong questions)
[Yu Yue education] National Open University autumn 2018 8109-22t (1) monetary and banking reference questions
Talk about the things that must be paid attention to when interviewing programmers
Breaking the information cocoon - my method of actively obtaining information - 3
Application and Optimization Practice of redis in vivo push platform
Acwing game 58 [End]
平台入驻与独立部署优缺点对比
ELFK部署
Scientific research: are women better than men?
【LeetCode】98. Verify the binary search tree (2 brushes of wrong questions)
The most powerful new household god card of Bank of communications. Apply to earn 2100 yuan. Hurry up if you haven't applied!
Kotlin - coroutine
2021 Li Hongyi machine learning (2): pytorch
1.五层网络模型
Marubeni Baidu applet detailed configuration tutorial, approved.
返回二叉树中两个节点的最低公共祖先
Idea inheritance relationship
Zabbix
Yolov5 model training and detection