LRU原理及实现是怎样的
LRU(Least Recently Used,最近最少使用)原理是:如果数据最近被访问过,那么将来被访问的几率也更高。 LRU的实现方式: 1. 使用双向链表,每次访问一个数据时,将其从原来的位置删除,放到链表头部; 2. 使用哈希表来加快寻找数据,哈希表存储数据和链表节点的映射关系;
// 利用双向链表实现LRU
public class LRUCache {// 双向链表节点 class Node { int key; int value; Node pre; Node next; public Node(int key, int value) { this.key = key; this.value = value; } } // 哈希表 private HashMap map; // 链表头节点 private Node head; // 链表尾节点 private Node tail; // 链表容量 private int capacity; public LRUCache(int capacity) { this.capacity = capacity; map = new HashMap<>(); head = new Node(0, 0); tail = new Node(0, 0); head.next = tail; tail.pre = head; } public int get(int key) { if (!map.containsKey(key)) { return -1; } // 将节点移到链表头部 Node node = map.get(key); moveToHead(node); return node.value; } public void put(int key, int value) { Node node = map.get(key); if (node == null) { // 添加新节点 node = new Node(key, value); map.put(key, node); addToHead(node); // 如果超出容量,则删除最后一个节点 if (map.size() > capacity) { Node tailNode = popTail(); map.remove(tailNode.key); } } else { // 更新节点 node.value = value; moveToHead(node); } } // 将节点移动到链表头部 private void moveToHead(Node node) { removeNode(node); addToHead(node); } // 将节点添加到链表头部 private void addToHead(Node node) { node.next = head.next; node.pre = head; head.next.pre = node; head.next = node; } // 删除节点 private void removeNode(Node node) { node.pre.next = node.next; node.next.pre = node.pre; } // 弹出链表尾部节点 private Node popTail() { Node node = tail.pre; removeNode(node); return node; }}
下一篇
怎么进行PCA原理分析 猜您想看
-
Java进程和线程的区别有哪些
一、Java进...
2023年05月25日 -
宝塔面板服务器防火墙规则设置技巧
1. 明白防火...
2024年05月30日 -
golang中怎么利用leetcode实现逆波兰式
一、逆波兰表达...
2023年07月22日 -
redis中性能优化常用方法有哪些
1. 合理使用...
2023年05月26日 -
如何在Steam上创建我的个人主页?
如何在Stea...
2023年05月05日 -
如何编写GIMP脚本使图像处理更快
如何编写GIM...
2023年07月23日