首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据结构与算法分析笔记——LRU算法缓存实现

数据结构与算法分析笔记——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)的。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200321A0ONCP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券