当前位置:网站首页>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
边栏推荐
- Naacl 2021 | contrastive learning sweeping text clustering task
- Summary and practice of knowledge map construction technology
- Acwing game 58 [End]
- Kotlin - 协程 Coroutine
- Linux Installation redis
- 数据库和充值都没有了
- TCP security of network security foundation
- Acwing第 58 场周赛【完结】
- Day_ 17 IO stream file class
- openresty ngx_lua变量操作
猜你喜欢

【LeetCode】222. The number of nodes of a complete binary tree (2 mistakes)

Devtools的简单使用

Design and implementation of campus epidemic prevention and control system based on SSM

Linux安装Redis

Design of kindergarten real-time monitoring and control system

Vb+access hotel service management system

Open source SPL optimized report application coping endlessly

1.五层网络模型

Pytest (4) - test case execution sequence

Asp+access campus network goods trading platform
随机推荐
Kotlin - coroutine
Design and implementation of kindergarten management system
Summary and practice of knowledge map construction technology
Vb+access hotel service management system
When to catch an exception and when to throw an exception- When to catch the Exception vs When to throw the Exceptions?
Simple use of devtools
[Yu Yue education] National Open University spring 2019 0505-22t basic nursing reference questions
El select, El option drop-down selection box
Chinese natural language processing, medical, legal and other public data sets, sorting and sharing
【LeetCode】110. Balanced binary tree (2 brushes of wrong questions)
This + closure + scope interview question
Qrcode: generate QR code from text
Application and Optimization Practice of redis in vivo push platform
Privatization lightweight continuous integration deployment scheme -- 01 environment configuration (Part 1)
Flume配置4——自定义MYSQLSource
Design of KTV intelligent dimming system based on MCU
Use UDP to send a JPEG image, and UPD will convert it into the mat format of OpenCV after receiving it
Voice chip wt2003h4 B008 single chip to realize the quick design of intelligent doorbell scheme
Pytest (4) - test case execution sequence
Elfk deployment