LRU算法及例题讲解

概念:

LRU(least recently used)是将近期最不会访问的数据给淘汰掉,其实LRU是认为最近被使用过的数据,那么将来被访问的概率也多,最近没有被访问,那么将来被访问的概率也比较低“,其实这个并不是正确的,但是因为LRU算法简单,存储空间没有被浪费,所以还是用的比较广泛的。





LRU原理:

LRU一般采用链表的放缓死实现,便于快速移动数据位置。网上找了一个图,感觉画的很赞,所以就粘过来了,为了说明问题~~~~~感谢这个图的作者!!!!





LRU的实现有两种方式:缓存命中后,是否要这个数据缓存项到LRU队列的最前端。

首先这个图说明的是LRU的一种实现方式,那就是在缓存访问命中后,要将这个数据缓存项到达LRU队列的最前端。第五步,将E插入缓存池后,这个缓存池已经满了,所以第六步插入F后,要考虑把近期没有访问的数据,也就是A给淘汰掉了(可怜的A啊。。。。)第七步,C被访问,从时间点来说,C最近被访问过了,所以移动到了链表的头部(暂时没有被淘汰);第八步,将G存入缓存后,G位于链表头部,那么B只能被淘汰了。。。。

因为链表的插入和删除时间复杂度都为O(1),所以用链表不用数组。。。。。(这句是参考别人的,还不是很懂,让我研究研究。。。)


还有数据缓存项不移动到LRU最前端的方式,由下面的例题来详细说明。


下面贴一个例题:


例:

大家一起来做题吧!



—————————————————————————————————————————————————————————————————————————————




解:

本题是有两种解答的。

1.缓存命中后,这个数据缓存项不要移动到链表最前端:

命中不调整缓存项内容快照如下:


1.  1

2.  5 1

3.  5 1

4.  3 5 1

5.  3 5 1

6.  2 3 5 1

7.  4 2 3 5(淘汰1)

8.  1 4 2 3 (淘汰5)

9   1 4 2 3(命中2

到达第6步时,缓存池已经满了,所以开始淘汰,淘汰两次,最后淘汰5

2.缓存命中后,这个数据缓存项要移动到链表最前端

1. 1

2. 5 1

3. 1 5

4. 3 1 5

5 .5 3 1

6. 2 5 3 1

7. 4 2 5 3(淘汰1)

8. 1 4 2 5(淘汰3)

9 .2 1  4 5



淘汰2次,最后淘汰3

  • 17
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
FIFO算法LRU算法都是为了解决缓存淘汰问题而设计的。FIFO算法是一种按照元素插入顺序排序的数据结构,元素在数据结构中按照先进先出的顺序进行存储和访问。在实现缓存时,可以根据实际情况选择使用FIFO算法LRU算法,以达到最佳的缓存淘汰效果。 LRU(Least Recently Used)算法是一种常见的缓存淘汰算法,它的基本思想是“最近最少使用”。在缓存中,最近使用的数据会被优先淘汰,而最近未使用的数据则需要被淘汰以腾出缓存空间。为了实现这一功能,LRU算法通过定期淘汰最近最少使用的数据来保持缓存的最佳状态。LRU算法的核心思想是使用一个缓存数组,数组中的每个元素都存储了一个键值对。每个键值对表示缓存中的一个数据项,包含数据项的键和值。 FIFO算法LRU算法的区别在于,FIFO算法是按照元素插入顺序排序的,而LRU算法是按照元素最近使用的时间排序的。因此,当缓存中的数据项被频繁访问时,LRU算法的效果会更好,因为它会优先保留最近使用的数据项,而FIFO算法则无法做到这一点。 以下是一个使用Python实现LRU算法的例子: ```python from collections import OrderedDict class LRUCache: def __init__(self, capacity: int): self.cache = OrderedDict() self.capacity = capacity def get(self, key: int) -> int: if key not in self.cache: return -1 self.cache.move_to_end(key) return self.cache[key] def put(self, key: int, value: int) -> None: if key in self.cache: self.cache.move_to_end(key) self.cache[key] = value if len(self.cache) > self.capacity: self.cache.popitem(last=False) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值