LRU算法及例题讲解

来源:互联网 发布:电脑事件提醒软件 编辑:程序博客网 时间:2024/05/23 11:37

概念:

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

0 0
原创粉丝点击