LRU(least recently used, 最近最少使用),LRU算法的设计原则是:
- 当数据在最近一段时间经常被访问,那么它在以后也会经常被访问。这就意味着,如果经常访问的数据,我们需要让其能够快速命中,而不常访问的数据,我们在容量超出限制内,要将其淘汰。
LRU的实现:链表 数组
- 数组:查询比较快,插入,删除的时间复杂度O(n)
- 链表:查询比较慢,但是对于增删来说十分方便,时间复杂度O(n)O(1)
- 链表和HashTable:HashTable主要用于查找数据,保证通过key访问数据的时间复杂度为O(1),而链表用来保存缓存数据。
算法的实现过程如图所示:
步骤:
- 当访问的数据命中缓存,遍历得到这个数据对应的结点,并将其从原来的位置删除,然后再插入到链表的头部;(修改链表指针O(1))
- 如果此数据没有在缓存链表中,分为两种情况:
- 如果此时缓存未满,则将此结点直接插入到链表的头部;
- 如果此时缓存已满,则遍历至链表尾结点将其删除,将新的数据结点插入链表的头部。
如图所示[attach detach]
PHP代码实现
1 | class ListNode |
运行结果
1 | Array |