概念:
LRU(leastrecentlyused )是丢弃最近不再访问的数据。 实际上,LRU认为,如果有最近使用的数据,将来访问的概率也很多,如果最近没有访问,将来访问的概率也很低。 “但其实这并不准确。 但是,由于LRU算法简单,不会浪费存储空间,所以还在广泛使用。
LRU原理:
LRU一般采用链表的死升实现,便于快速移动数据位置。 我在网上找了图,感觉画得很厉害,所以贴了。 为了说明问题~~~~~感谢这张图的作者! 呃! 呃! 呃!
有两种实现LRU的方法。 在缓存命中后,是否将此数据缓存项放在LRU队列的开头。
首先,此图像显示了如何实现LRU。 也就是说,在缓存访问命中后,使此数据缓存条目到达LRU队列的开头。 步骤5、将e插入缓存池后,此缓存池已满,在步骤6中插入f后,考虑丢弃最近未访问的数据,即a。 请参阅。 请参阅。 请参阅。 )在步骤7中,c被访问,此时,c已经移动到链表的头部,因为最近被访问过(在步骤8中,将g保存在缓存中后,如果g位于链表的开头,b只会被淘汰。 请参阅。 请参阅。 请参阅。
插入和删除链表的时间复杂度都是o(1),所以不使用链表,不使用数组。 请参阅。 请参阅。 请参阅。 请参阅。 (这篇文章是参考了别人的,我还不太清楚,请让我研究一下。 请参阅。 请参阅。 ) )
另外,关于数据缓存项目不移动到LRU开头的方式,将在以下例题中详细说明。
让我们贴一个例题:
例如:
大家一起做问题吧!
——3354——3——3——3——33——333——33——333334——3——333——33333——3333——333——333——3333——3333——333333——33333——33334333333333——333333
解:
正题有两种解答。
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(4)2)命中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
两次淘汰,最后三次淘汰