【数据结构】LRU Cache

在这里插入图片描述

文章目录

  • LRUCache


LRUCache

1.
LRUCache是一种缓存的替换技术,在CPU和main memory之间根据计算机的局部性原理,往往会采用SRAM技术来构建CPU和主存之间的高速缓存,DRAM(dynamic random access memory)用于构建主存,LRUCache这种缓存替换技术常被应用于高速缓存中缓存行的替换,我们接下来就要模拟实现LRUCache这种数据结构。

LRU 缓存

2.
LRUCache主要实现两个接口,一个是get,一个是put,实现get和put有人可能会想到用一个哈希表,因为哈希表查找和插入数据的时间复杂度刚好是O(1),这当然没问题,但是你如何实现LRU呢?
我们如何每次在数据满了之后,删除的数据是最近没有访问的数据呢?这该怎么保证?实际上要保证LRU方式数据的删除和更新,使用一个链表是最合适不过的了,如果我们访问了某一个数据,那就把这个数据从链表中的某一位置移动到链表头去,这样的话,每次最近访问的数据都会在链表的头部,而长时间不访问的数据就会在链表尾部放着,那么当数据结构中数据满了的时候,我们只要将链表尾部的数据删除即可,然后将新到来的数据重新插入到数据结构中,这样就可以实现LRU了。
但是现在还有一个问题,我们是将数据存储到链表当中了,但是当涉及到更新操作时,如何快速找到特定的pair结点,将他的value值更改呢?如果遍历链表来更新的话,那么这个操作就不是O(1)了而是O(N),所以如何找到特定结点成为了破局的关键!我们让哈希表存储的pair对中的value值为链表的迭代器,这样一来就完美设计出一个高效的LRUCache结构了。
在查找某一结点时,我们直接用哈希表就可以实现O(1)的快速查找,只要能够查找到结点,那么get操作,put时可能的更新操作,这些就都是O(1)时间复杂度了。
在实现代码时,如果我们访问了某个结点,那么就要把这个结点转移到链表头部,转移的操作可以使用erase+push_front,但这样会涉及到迭代器失效的问题,因为哈希表中存储的迭代器指向原来的结点,结点被你erase了,那么迭代器就会失效,我们还需要自己重新更改哈希表中存储的迭代器,这样有点麻烦,同时删除结点其实会遍历链表,这样的操作也不是很高效,那么这时候STL还给我们提供了一个接口splice,意为拼接,可以将某一位置的迭代器指向的结点,拼接到链表中的任意位置,拼接的原理其实就是通过更改指针的指向来完成结点的转移,这样就可以不用释放结点和重新申请结点的操作了,效率就会高一些。

在这里插入图片描述

3.
某些面试官为了测试我们的能力,并不想让我们使用STL自带的list,而是想要让我们手搓一个链表来完成这题,则我们可以自己实现一个双向循环链表,为了使得头插尾删操作的便捷性,与传统的带头双向循环链表不同的是,我们可以伪造两个哨兵卫结点,一前一后,分别是dummyHead和dummyTail,这样在实现尾删接口时,我们不用再去找尾,同时在头插时也不用考虑结点作头的情况,直接在dummyHead后面插入即可,所以说,两个哨兵卫结点是真的香啊!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/470594.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读-PIM-tree:一种面向内存处理的抗偏移索引

论文名称:PIM-tree: A Skew-resistant Index for Processing-in-Memory 摘要 当今的内存索引性能受到内存延迟/带宽瓶颈的限制。Processing-in-memory (PIM) 是一种新兴的方法,可能通过实现低延迟内存访问,其聚合内存带宽随 PIM 节点数量扩…

文案馆头像壁纸微信小程序源码【支持流量主】

文案馆头像壁纸微信小程序源码【支持流量主】 源码介绍:文案馆头像壁纸微信小程序源码是一款可以获取套图、头像、壁纸的小程序。小程序源码内置流量主功能 需求环境:微信小程序phpmysql 下载地址: https://www.changyouzuhao.cn/13453.ht…

新机Word/PowerPoint新建空白文档后闪退问题

首先可以尝试一下常规的修复: 设置-应用-安装的应用-搜索office-点击Micros Office Home and Student...右侧三个点-选择修改-点击是-快速修复-修复 再不行就按上面的选择联机修复,这个会卸载现有Office然后自动帮你重新下载 我做了以上两个都没有解决问…

项目访问量激增该如何应对

✨✨ 欢迎大家来到喔的嘛呀的博客✨✨ 🎈🎈希望这篇博客对大家能有帮助🎈🎈 目录 引言 一. 优化数据库 1.1 索引优化 1.2 查询优化 1.3 数据库设计优化 1.4 事务优化 1.5 硬件优化 1.6 数据库配置优化 二. 增加服务器资源…

2024 前端面试题(GPT回答 + 示例代码 + 解释)No.21 - No.40

本文题目来源于全网收集,答案来源于 ChatGPT 和 博主(的小部分……) 格式:题目 h3 回答 text 参考大佬博客补充 text 示例代码 code 解释 quote 补充 quote 上一篇链接:2024 前端面试题(GPT回答 示例…

html的表格标签

html的表格标签 table标签:表示整个表格tr:表示表格的一行td:表示一个单元格th:表示表头单元格.会居中加粗thead:表格的头部区域 (注意和th区分,范围是比th要大的).tbody:表格得到主体区域. table包含tr , tr包含td或者th. 表格标签有一些属性,可以用于设置大小边…

第13讲我创建的投票列表实现

新建我创建的投票页面 {"path": "pages/createVoteList/createVoteList","style": {"navigationBarTitleText": "我创建的投票"}}个人中心页面,加下 点击 “我创建的投票”跳转列表页面 goVoteList:function(){u…

【Java程序员面试专栏 分布式中间件】ElasticSearch 核心面试指引

关于ElasticSearch 部分的核心知识进行一网打尽,包括ElasticSearch 的基本概念,基本架构,工作流程,存储机制等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 从数据分类入手,考察全文索引的基本概念 现实世界中数据有哪…

【网络攻防实验】【北京航空航天大学】【实验四、防火墙配置(Firewall Configuration)实验】

实验四、防火墙配置(Firewall Configuration)实验 一、 实验环境搭建 1. Kali Linux网络配置 将Kali Linux虚拟机网卡1设置为NAT网络模式,ip地址为10.0.2.5,如下图所示: 配置NAT网络端口转发: 将Kali Linux网卡2设置为内部网络模式: 配置Kali Linux网卡1: 类似地,配…

(四十)大数据实战——Zabbix监控平台的部署搭建

前言 Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警,这样可以快速反馈服务器的问题。基于已存储的数据,Zabbix提供了出色的报告和数据可视化功能。…

K8S集群实践之十:虚拟机部署阶段性总结

目录 1. 说明: 2. 安装准备 2.1 每个节点设置双网卡,一卡做网桥(外部访问),一卡做NAT(集群内网访问) 2.2 准备一个可用的代理服务器 3. 由于虚拟机崩溃(停电,宿主机…

linux(阿里云)安装pytorch

目录 环境 安装步骤 1 检查python3和pip3是否已经安装 2 安装pytorch 3 安装完毕,检查pytorch版本 环境 阿里云 ubuntu 22.04 UEFI版 64位 安装步骤 1 检查python3和pip3是否已经安装 输入下面两条指令: python3 --version pip --version 检…