如何实现一个LRU算法

Least recently used,也就是最近最旧未被使用的算法。其核心思想就是:最近被访问到的数据,在未来也可能被访问到。
摘要由CSDN通过智能技术生成

首先,什么是LRU算法呢?全称是:Least recently used,也就是最近最旧未被使用的算法。其核心思想就是:最近被访问到的数据,在未来也可能被访问到。

所以按照LRU算法来说,数据是有个优先级的,最近访问到的优先级就最高,例如:顺序访问1 2 3 4 5 6的话,那么在此刻1的优先级就是最低的。

LRU算法一般用于资源有限的情况下淘汰某些数据使用,Redis的淘汰策略中就有使用LRU实现。

原理

原理其实也很简单,就是每次访问一个元素时就将元素优先级提到最高。所以实现的是需要使用有序的数据结构的,数组,链表都能实现。

为什么不使用队列和栈呢?这是因为有些元素可能是已经存在数据结构中了,那就有可能再次访问它,此时就需要将它移动到首位,而队列和栈只能取队首和栈顶的数据无法将中间部位的数据移动。

例如:

图1

如果使用数组那每次访问已经在数组中的元素时都需要整体移动,效率不高。

所以一般LRU都是使用链表实现的,而使用链表时为了将元素从链表中间调整到链表头,那就需要将当前这个元素的前后元素改变指针,所以为了能取得前一个元素,则链表也需要使用双向链表。

再然后如果单纯使用链表的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是使用Java实现Lru算法的示例代码。 Lru算法的核心是维护一个有序的缓存,每次访问缓存时,将访问的缓存项移到最前面,并删除最后一个缓存项。在Java中,我们可以使用双向链表和哈希表来实现这个有序缓存。 以下是一个简单的Java实现: ```java import java.util.HashMap; import java.util.Map; public class LruCache<K, V> { class Node { K key; V value; Node prev; Node next; Node(K key, V value) { this.key = key; this.value = value; } } private final int capacity; private final Map<K, Node> map = new HashMap<>(); private Node head; private Node tail; public LruCache(int capacity) { this.capacity = capacity; } public V get(K key) { Node node = map.get(key); if (node != null) { remove(node); add(node); return node.value; } return null; } public void put(K key, V value) { Node node = map.get(key); if (node != null) { node.value = value; remove(node); add(node); } else { if (map.size() == capacity) { map.remove(tail.key); remove(tail); } node = new Node(key, value); add(node); map.put(key, node); } } private void add(Node node) { if (head == null) { head = node; tail = node; } else { node.next = head; head.prev = node; head = node; } } private void remove(Node node) { if (node == head) { head = node.next; if (head != null) { head.prev = null; } } else if (node == tail) { tail = node.prev; if (tail != null) { tail.next = null; } } else { node.prev.next = node.next; node.next.prev = node.prev; } } } ``` 这个LruCache类使用了双向链表和哈希表来维护一个有序缓存,每次访问缓存时,将访问的缓存项移到最前面,并删除最后一个缓存项。在put方法中,如果缓存中已经存在该缓存项,则更新缓存项的值,并将其移到最前面,否则,如果缓存已满,则删除最后一个缓存项,并将新的缓存项添加到最前面。 示例代码: ```java LruCache<String, Integer> cache = new LruCache<>(2); cache.put("a", 1); cache.put("b", 2); System.out.println(cache.get("a")); // 1 cache.put("c", 3); System.out.println(cache.get("b")); // null cache.put("d", 4); System.out.println(cache.get("a")); // null System.out.println(cache.get("c")); // 3 System.out.println(cache.get("d")); // 4 ``` 在上面的示例中,我们创建了一个容量为2的LruCache,向其中添加了三个缓存项,当缓存项数量超过容量时,会自动删除最近最少使用的缓存项,所以最终缓存中只剩下了"c"和"d"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值