【数据结构】LRU Cache

news2024/11/28 19:43:21

在这里插入图片描述

文章目录

  • 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.coloradmin.cn/o/1450394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如: (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号,因为括号更改了操作优先级,限定了语言的语义,这是非常重要的。如果括号不完整,那么整个…

Ps:焦点堆栈

焦点堆栈 Focus Stacking是一种摄影和图像处理技术,通过合并多张在不同焦距拍摄的照片来创建一张具有更大景深的图像,特别适用于微距摄影、风景摄影和任何需要在整个场景中保持尖锐对焦的情况。 ◆ ◆ ◆ 拍摄注意事项 1、使用三脚架 为了确保图像之间…

STM32——OLED菜单(二级菜单)

文章目录 一.补充二. 二级菜单代码 简介:首先在我的51 I2C里面有OLED详细讲解,本期代码从51OLED基础上移植过来的,可以先看完那篇文章,在看这个,然后按键我是用的定时器扫描不会堵塞程序,可以翻开我的文章有单独的定时…

医院三基怎么搜题答案? #学习方法#学习方法#微信

在大学生的学习过程中,遇到难题和疑惑是常有的事情。然而,随着互联网的普及和技术的发展,搜题和学习软件成为了大学生们解决问题的利器。今天,我将向大家推荐几款备受大学生喜爱的搜题和学习软件,帮助我们更好地应对学…

VMware虚拟机网络配置

VMware虚拟机网络配置 桥接模式NAT网络 桥接模式 桥接模式其实就是借助你宿主机上的网卡进行联网和通信,所以相当于虚拟机和宿主机平级,处于同一个网段中。 配置要点: 注意选择正确的宿主机网卡 查看宿主机的网络信息,这些信息指…

VMwareWorkstation17.0虚拟机安装Windows2.03

VMwareWorkstation17.0虚拟机安装Windows2.03 第一篇 下载Windows2.03第二篇 配置Windows2.03虚拟机机器环境第三篇 启动Windows2.03系统 第一篇 下载Windows2.03 1.Windows2.0原版软盘下载地址是 暂不提供,后续更新 2.Windows2.03虚拟机镜像下载地址是 Windows2…

ChatGPT高效提问—prompt实践(白领助手)

ChatGPT高效提问—prompt实践(白领助手) ​ 随着社会的不断发展,白领的比例越来越高。白领的工作通常较为繁忙,需要管理复杂的项目。工作量大、要求高、任务紧急,时间分配不当部分可能导致工作效率低下,任…

云备份项目:在云端保护您的数据【二、开发】

☘️过度的信息对一个过着充实生活的人来说,是一种不必要的负担☘️ 文章目录 前言工具类实现文件实用工具类代码实现 Json实用工具类代码实现 服务端单例配置类系统配置信息单例配置类 数据管理类数据信息数据管理 热点管理类业务处理类 客户端数据管理类文件备份类…

基于微信小程序的智能社区服务小程序,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

嵌入式中UART通信的方法

UART是一种异步全双工串行通信协议,由 Tx 和 Rx 两根数据线组成,因为没有参考时钟信号,所以通信的双方必须约定串口波特率、数据位宽、奇偶校验位、停止位等配置参数,从而按照相同的速率进行通信。 异步通信以一个字符为传输单位…

HDR 摄影

HDR 摄影,即高动态范围 High Dynamic Range摄影,旨在通过合并不同曝光值的照片来捕捉场景中从最亮到最暗部分的全部细节。 这种技术对于在一个图像中展现广泛的亮度范围特别有用,尤其是在自然光线条件下,如直射日光或阴影区域&…

[BUUCTF]-PWN:ciscn_2019_final_3解析

查看保护 RELRO保护为FULL,got表不可修改,只能修改hook表了 查看ida 这里的大致功能为alloc创建堆块(可填充内容)、free释放堆块(但是不清空指针) 值得注意的就是创建堆块大小不可以超过0x78(…

HTB pwn Evil Corp

程序分析 初始化功能 申请了一块正常块和一块可以执行shellcode的空间 登录 向正常块写入数据 字符宽度转换 漏洞分析 所有的输入都使用了fgetws函数这个函数,这个函数会把整个串的每一个字符按最低两个宽来接收输入,如果存在unicode32等等更宽的字符这个函数会把每个字符都…

积分(一)——复化梯形积分(C++)

梯形积分 设f(x)在[a,b]上连续,若要计算其积分,则 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_a^b f(x)dx F(b) - F(a) ∫ab​f(x)dxF(b)−F(a) 其中F(x)为f(x)的原函数,但是计算机直接计算出该积分函数比较困难,因此需要近…

六、Datax通过json字符串运行

Datax通过json字符串运行 一、场景二、代码实现 一、场景 制作一个web应用,在页面上配置一个json字符串,保存在数据库里面。在执行json的时候,动态在本地创建一个json文件后执行,并识别是否成功,将执行过程保存在数据…

fgets的使用方法详解

fgets的使用 文章目录 fgets的使用前言(吹水,不看也罢)fgets 的基本语法使用示例fgets() 对输入的处理的特点gets() 与 fgets() 的主要区别 总结 前言(吹水,不看也罢) 鼠鼠今天在B站上大学的时候&#xff…

离散傅里叶变换

目标 我们将寻求以下问题的答案: 什么是傅里叶变换,为什么要使用它?如何在OpenCV中做到这一点?使用以下函数:copyMakeBorder() , merge() , dft…

蓝桥杯:C++排列与组合

排列是暴力枚举时的常见操作。有以下两种情况。 C的 next_permutation()是全排列函数,只能输出序列中所有元素的全排列。 本节将给出手写排列和组合的代码。因为在很多场合中不能使用系统自带的排列函数,所以需要自己编写。 全排列函数:nex…

Lag-Llama:第一个时间序列预测的开源基础模型介绍和性能测试

2023年10月,我们发表了一篇关于TimeGPT的文章,TimeGPT是时间序列预测的第一个基础模型之一,具有零样本推理、异常检测和共形预测能力。 虽然TimeGPT是一个专有模型,只能通过API访问。但是它还是引发了对时间序列基础模型的更多研…

读十堂极简人工智能课笔记03_遗传算法与进化

1. 寻找正确答案 1.1. 卡尔西姆斯 1.1.1. 计算机图形艺术家和研究者 1.1.2. 演示过数字进化之创造性和新颖性的先驱 1.1.3. 1994年 1.1.3.1. 创造一批能游泳、走路、跳跃,甚至互相竞争的虚拟动物震惊了整个科学界 1.1.3.2. 它们的人工大脑却是个极其复杂的网络…