当前位置: 首页 > news >正文

LRU缓存——双向链表+哈希表

请你设计并实现一个满足  LRU (最近最少使用) 缓存 约束的数据结构。

实现 LRUCache 类:

  • LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
  • int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
  • void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。

函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。

示例:

输入
["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
输出
[null, null, null, 1, null, -1, null, -1, 3, 4]解释
LRUCache lRUCache = new LRUCache(2);
lRUCache.put(1, 1); // 缓存是 {1=1}
lRUCache.put(2, 2); // 缓存是 {1=1, 2=2}
lRUCache.get(1);    // 返回 1
lRUCache.put(3, 3); // 该操作会使得关键字 2 作废,缓存是 {1=1, 3=3}
lRUCache.get(2);    // 返回 -1 (未找到)
lRUCache.put(4, 4); // 该操作会使得关键字 1 作废,缓存是 {4=4, 3=3}
lRUCache.get(1);    // 返回 -1 (未找到)
lRUCache.get(3);    // 返回 3
lRUCache.get(4);    // 返回 4

思路:双向链表实现最久未使用的判定,最靠前的最久未使用的。当访问(或插入)了某一个节点后,需要将这个节点挪到链表的尾部。

当双向链表删除最久未使用的节点后,还需记得删除哈希表中对应的信息【哈希表和双向链表中存储的信息应统一】。

该方法的数据结构很巧妙:DLinkedNode中有key和value,存储key实现了可以通过链表节点反向寻找哈希表,在删除时很有用。哈希表是{key:DLinkedNode}的结构,可以实现链表的随机访问(而非顺序访问)。

class DLinkedNode:def __init__(self, key=0, value=0):self.key = keyself.value = valueself.prev = Noneself.next = Noneclass LRUCache:def __init__(self, capacity: int):self.capacity = capacityself.cache = {}self.size = 0self.head=DLinkedNode()self.tail=DLinkedNode()self.head.next=self.tailself.tail.prev=self.headdef get(self, key: int) -> int:if key in self.cache:node = self.cache[key]self.toTail(node)return node.valueelse:return -1def put(self, key: int, value: int) -> None:if key in self.cache:node = self.cache[key]node.value = valueself.toTail(node)else:self.cache[key] = DLinkedNode(key, value)self.enterTail(self.cache[key])if self.size < self.capacity:self.size += 1else:key=self.removeFirst()self.cache.pop(key)def removeFirst(self):key = self.head.next.keyself.head.next.next.prev = self.headself.head.next = self.head.next.nextreturn keydef toTail(self,node):node.prev.next = node.nextnode.next.prev = node.prevself.enterTail(node)def enterTail(self,node):node.next = self.tailnode.prev = self.tail.prevself.tail.prev.next = nodeself.tail.prev = node

http://www.dtcms.com/a/462429.html

相关文章:

  • 新生培训之 前缀和与差分 ----差分篇
  • 班级网站主页怎么做wordpress上传插件卡死
  • Microsoft Agent Framework深度解析:重新定义企业级AI智能体开发的游戏规则
  • 在 K8s 上可靠运行 PD 分离推理:RBG 的设计与实现
  • 自己的网站服务器网站平台建设缴纳什么税
  • 我的C++学习初体验与心得
  • 网站建设框架模板东营有做网站的公司
  • 学校网站建设项目需求报告小程序代理加盟条仿
  • Linux网络编程(上)
  • 基于wordpress站点的域名迁移
  • spring 框架中常用注解汇总,及对应作用介绍、使用示例demo演示
  • 网站后台下载二级建造师报名官网
  • 济宁住房和城乡建设局网站秦皇岛 免费建网站
  • 企业网站建设报价方案动易官方网站
  • 制作一个 MBTI 人格测试网页项目
  • Echarts如何实现line的实线虚线的分段,并且虚实线连接点平滑过度效果(未来预测场景)?
  • 苍穹外卖day06
  • mysql大表批量查询中IN vs JOIN vs CTE 性能实验
  • Cryptomator:免费的加密工具,
  • 逐位加|二分
  • 外贸行业网站推广wordpress galleria
  • 没技术怎么做网站湛江的高铁站建在哪里
  • MySQL 中数据完整性约束、外键管理(含级联策略) 和多表查询
  • 做效果图的网站有哪些软件有哪些wordpress漂浮
  • 为什么ffmpeg进行视频合成有时长误差
  • 做旅游销售网站平台ppt百度的域名
  • 网站建营销型企业网站有哪些类型
  • 2008服务器网站专门做定制的网站
  • 【软件设计师中级】计算机组成与结构(四):总线系统 - 计算机的“高速公路网络“
  • 专注服务于站长和网站的信息平台.网站建设需要学ps吗