数据结构与算法分析笔记——LRU算法缓存实现
题目
设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作:获取数据 get 和 写入数据 put 。
获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。
你是否可以在 O(1) 时间复杂度内完成这两种操作?
LRU
LRU,即最近最少使用原则,选择最近最久未使用的予以淘汰。
题目分析
只要了解LRU的含义,本题并不复杂。需要考虑的是,如何在O(1)的时间复杂度内容完成。
代码
分析
代码中,Node的定义和使用是关键。Node中包含了缓存中已存在的key,并且通过pre和next,形成了一个双向链表。LruCache类的firstNode和lastNode分别保存了第一个key和最后一个key。并且,在Cache中,也包含了指向对应Node的变量。
有了以上定义后,要做的就是,在任何操作时,都把最近访问的一个Node移动至链表的最后,也就是lastNode,而firstNode,永远是当缓存满时要被删除的那个。具体过程如下:
get时,如果找到了对应缓存,就把该缓存对应的Node从链表原位置删除,并放到最后。因为Cache保留了指向Node的引用变量,所以,该操作是O(1)的。
put时,先判断是否满容,如满,则将firstNode删除,firstNode指向原firstNode的next。然后,构建一个新的Node,放到链表的最后。也可以通过相应的引用变量直接找到要操作的目标,所以,该操作也是O(1)的。
领取专属 10元无门槛券
私享最新 技术干货