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

[C++][数据结构][LRU Cache]详细讲解

目录

  • 1.什么是LRU Cache?
  • 2.LRU Cache实现


1.什么是LRU Cache?

  • LRULeast Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。
  • 什么是 Cache?
    • 狭义的Cache指的是位于CPU和主存间的快速RAM
      • 通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术
    • 广义上的Cache指的是位于速度相差较大的两种硬件之间, 用于协调两者数据传输速度差异的结构
    • 除了CPU与主存之间有Cache, 内存与硬盘之间也有Cache,乃至在硬盘与网络之间也有某种意义上的Cache ── 称为Internet临时文件夹或网络内容缓存等
  • Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容
  • LRU Cache的替换原则就是将最近最少使用的内容替换掉
    • 其实,LRU译成最久未使用会更形象,因为该算法每次替换掉的就是一段时间内最久没有使用过的内容

2.LRU Cache实现

  • 实现LRU Cache的方法和思路很多,但是要保持高效实现O(1)的Put和Get,那么使用双向链表和哈希表的搭配是最高效和经典的

    • 双向链表是因为双向链表可以实现任意位置O(1)的插入和删除
    • 哈希表是因为哈希表的增删查改也是O(1)
  • 关键:找到key,就要找到key对应存储数据在list中的位置

    请添加图片描述

class LRUCache
{
public:LRUCache(int capacity): _capacity(capacity){}int Get(int key){auto ret = _hashMap.find(key);if (ret != _hashMap.end()){LtIter it = ret->second;// 更新key对应值的位置,splice转移结点_LRUList.splice(_LRUList.begin(), _LRUList, it);return it->second;}else{return -1;}}void Put(int key, int value){auto ret = _hashMap.find(key);if (ret == _hashMap.end()) // 1.新增{if (_hashMap.size() == _capacity){// 若满,则先删除LRU的数据pair<int, int> back = _LRUList.back();_hashMap.erase(back.first);_LRUList.pop_back();}_LRUList.push_front({ key, value });_hashMap[key] = _LRUList.begin();}else // 2.更新{LtIter it = ret->second;it->second = value; // 更新// 更新key对应值的位置,splice转移结点_LRUList.splice(_LRUList.begin(), _LRUList, it);}}
private:typedef list<pair<int, int>>::iterator LtIter;// hash做到查找更新是O(1),value值存的是list的iteratorunordered_map<int, LtIter> _hashMap;// LRU,假设尾部数据就是最近最少用list<pair<int, int>> _LRUList;size_t _capacity;
};

相关文章:

[C++][数据结构][LRU Cache]详细讲解

目录 1.什么是LRU Cache&#xff1f;2.LRU Cache实现 1.什么是LRU Cache&#xff1f; LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。什么是 Cache&#xff1f; 狭义的Cache指的是位于CPU和主存间的快速RAM 通常它不像系统…...

怎样激励员工积极应用新版FMEA培训后的知识?

在快节奏的职场环境中&#xff0c;新版FMEA&#xff08;失效模式与影响分析&#xff09;的培训无疑是提升员工技能、优化工作流程的重要一环。然而&#xff0c;如何让员工积极地将所学知识应用于实际工作中&#xff0c;却是一个值得深入探讨的问题。下面&#xff0c;深圳天行健…...

WDF驱动开发-WDF总线枚举(一)

支持在总线驱动程序中进行 PnP 和电源管理 某些设备永久插入系统&#xff0c;而其他设备可以在系统运行时插入和拔出电源。 总线驱动 必须识别并报告连接到其总线的设备&#xff0c;并且他们必须发现并报告系统中设备的到达和离开情况。 总线驱动程序标识和报告的设备称为总线…...

React useEffect 执行时机

默认情况下&#xff0c;Effect 在每次渲染&#xff08;包括初始渲染&#xff09;后运行。 如果 React 的所有依赖项都与上次渲染时的值相同&#xff0c;则将跳过本次 Effect。 useEffect(() > {// 这里的代码会在每次渲染后执行 });useEffect(() > {// 这里的代码只会在…...

centos7 根目录扩容

1、先检查一下磁盘空间 [rootlocalhost ~]# lsblk 二、使用fdisk创建新分区 [rootlocalhost ~]# fdisk /dev/vdb 1、输入 p &#xff0c;查看当前分区表&#xff1b; 2、输入 n &#xff0c;新建一个分区&#xff1b; 3、再输入 p &#xff0c;选择分区类型为主分区&#x…...

为什么要做Redis分区和分片

Redis分区&#xff08;Partitioning&#xff09;和分片&#xff08;Sharding&#xff09;是将数据分布在多个Redis实例或多个节点上的做法。这种技术用于提高性能、可扩展性和可用性。以下是执行Redis分区和分片的主要原因&#xff1a; 1. **提高吞吐量**&#xff1a; - 通…...

电脑不小心删除的文件怎么恢复?4个必备恢复方法!

“刚刚在对电脑里的某些垃圾文件进行清理时&#xff0c;我一不小心误删了比较重要的数据。这些误删的数据还有机会恢复吗&#xff1f;希望大家帮帮我&#xff0c;非常感谢&#xff01;” 在这个数字化飞速发展的时代&#xff0c;电脑早已成为我们日常生活和工作中不可或缺的一部…...

GPTCache:革新大模型缓存,降低成本,提升效率

GPTCache介绍 随着应用程序越来越受欢迎并遇到更高的流量水平,与 LLM API 调用相关的费用可能会变得相当可观。此外,LLM 服务的响应时间可能会很慢,尤其是在处理大量请求时。GPTCache是一个致力于构建用于存储 LLM 响应的语义缓存的项目。 项目架构 数字人助力传统客服 1…...

[Day 15] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的數字身份認證 1. 概述 數字身份認證是當今數字世界中的關鍵問題之一。傳統的身份驗證方法面臨著安全性、隱私性和可信度等方面的挑戰。區塊鏈技術通過其去中心化、不可篡改和可追溯的特性&#xff0c;為解決這些問題提供了新的可能性。本文將深入探討區塊鏈在數字身份…...

绘唐3下载地址

小说推文是一种将小说内容以推文的形式发布的方式&#xff0c;可以吸引更多读者的关注。以下是一些小说推文工具&#xff1a;下载地址 Twitter&#xff1a;Twitter是一个非常受欢迎的社交媒体平台&#xff0c;适合发布小说推文。你可以使用Twitter的140个字符限制来创造悬念和吸…...

两个基因相关性细胞系(CCLE)(升级)

目录 单基因CCLE数据 ①细胞系转录组CCLE数据下载 ②单基因泛癌表达 CCLE两个基因相关性 ①进行数据整理 ②相关性分析 单基因CCLE数据 ①细胞系转录组CCLE数据下载 基因在各个细胞系表达情况_ccle expression 23q4-CSDN博客 rm(list = ls()) library(tidyverse) libra…...

2024全国各地高考录取分数线一览表(含一本、二本、专科)

2024年高考录取分数线陆续公布&#xff0c;上大学网(www.sdaxue.com)为大家整理全国31个省市高考录取分数线汇总&#xff0c;包括本科批、专科批和特殊类招生控制分数线汇总&#xff0c;来看看你的省份多少分能上大学吧。 一、2024年全国高考录取线一览表 1、宁夏 一本线&…...

汇编快速入门

一.基础知识 1.数据类型 DB&#xff08;Define Byte&#xff0c;字节类型 占位8位bit 1字节&#xff09; 范围&#xff1a;DB可以用来定义&#xff08;无符号、有符号&#xff09;整数&#xff08;包含二、十、十六进制&#xff09;和字符 语法&#xff1a;a DB 数据个数…...

Apache Tomcat 10.1.25 新版本发布 java 应用服务器

Tomcat 是一个小型的轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试 JSP 程序的首选。对于一个初学者来说&#xff0c;可以这样认为&#xff0c;当在一台机器上配置好 Apache 服务器&#xff0c;可利用它响应对 H…...

数据类型 运算符

基本数据类型与引用数据类型的区分 存储内容&#xff1a; 基本数据类型&#xff1a;直接存储实际的数据值&#xff0c;如整数、浮点数、字符等。引用数据类型&#xff1a;存储对象的引用&#xff08;内存地址&#xff09;&#xff0c;而不是对象本身。 内存分配&#xff1a; 基…...

WordPress网创自动采集并发布插件

网创教程&#xff1a;WordPress插件网创自动采集并发布 阅读更新&#xff1a;随机添加文章的阅读数量&#xff0c;购买数量&#xff0c;喜欢数量。 使用插件注意事项 如果遇到404错误&#xff0c;请先检查并调整网站的伪静态设置&#xff0c;这是最常见的问题。需要定制化服…...

(十三)、MQTT3.1.1-MQTT服务端数据结构设计

为进一步实现一个简易的MQTT服务端&#xff0c;做如下服务端数据结构设计。 1、服务端协议相关的函数 连接 rx_connect() 接收连接请求 Socket中监听&#xff0c;通过第一个字节switch&#xff0c;根据数据创建client对象 tx_connectack() 回复连接响应 处理完成rx_conn…...

StackOverFlowError常见原因及解决方法总结

StackOverFlowError常见原因及解决方法总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨一下 Java 中一个常见的错误&#xff1a;StackOverFl…...

【安全】Linux Fanotify使用入门

1 Fanotify vs Inotify 在实现某些功能时&#xff0c;可能需要获取某个文件执行的操作&#xff0c;一种可能的方案是用Audit的路径监控&#xff0c;但是Audit存在性能和内核稳定性问题&#xff0c;这个时候就可以其他的文件变更检测机制。 inotify可以监控文件被创建、修改和…...

java的输出流File OutputStream

一、字节输出流FileOutput Stream 1、定义 使用OutputStream类的FileOutput Stream子类向文本文件写入的数据。 2.常用构造方法 3.创建文件输出流对象的常用方式 二、输出流FileOutputStream类的应用示例 1.示例 2、实现步骤 今天的总结就到此结束啦&#xff0c;拜拜&#x…...

ThinkPad风扇控制终极指南:如何让你的笔记本在静音与散热之间找到完美平衡

ThinkPad风扇控制终极指南&#xff1a;如何让你的笔记本在静音与散热之间找到完美平衡 【免费下载链接】TPFanCtrl2 ThinkPad Fan Control 2 (Dual Fan) for Windows 10 and 11 项目地址: https://gitcode.com/gh_mirrors/tp/TPFanCtrl2 你是否曾经在深夜工作时&#xf…...

5步搭建Sunshine游戏串流服务器:打造你的私人云游戏平台

5步搭建Sunshine游戏串流服务器&#xff1a;打造你的私人云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款功能强大的自托管游戏串流服务器&#xff0c;专…...

Harness Open Source 与 GitLab 的区别:一个轻量一体化 DevOps 平台,一个完整 DevSecOps 平台

Harness:https://github.com/harness/harness 一、先给结论 Harness Open Source 和 GitLab 都可以做代码托管、代码协作、CI/CD 和制品管理,但二者的产品边界不同。 Harness Open Source 官方定位是一个开源的一体化开发平台,集成源码管理、CI/CD pipelines、托管开发环…...

SLO-Warden:基于错误预算的智能SLO守护平台设计与实践

1. 项目概述&#xff1a;一个面向SLO的智能守护者在云原生和微服务架构成为主流的今天&#xff0c;服务的稳定性和可靠性不再是“锦上添花”&#xff0c;而是“生死攸关”的底线。作为一线的运维工程师或SRE&#xff0c;我们每天都在和各种监控指标、告警风暴作斗争。传统的监控…...

二维无金属铁磁半金属AsN2:p轨道自旋电子学的理论突破与计算设计

1. 二维无金属铁磁半金属&#xff1a;一个值得深挖的“潜力股”最近几年&#xff0c;二维材料这个领域真是热闹非凡&#xff0c;从石墨烯一炮而红开始&#xff0c;各种新奇的结构和性质层出不穷。作为一名长期关注计算材料学和自旋电子学的从业者&#xff0c;我一直在寻找那些既…...

QtUnblockNeteaseMusic终极指南:高效解锁网易云音乐地区限制

QtUnblockNeteaseMusic终极指南&#xff1a;高效解锁网易云音乐地区限制 【免费下载链接】QtUnblockNeteaseMusic A desktop client for UnblockNeteaseMusic, made with Qt. 项目地址: https://gitcode.com/gh_mirrors/qt/QtUnblockNeteaseMusic QtUnblockNeteaseMusic…...

【ElevenLabs葡语语音实战指南】:20年AI语音工程师亲测的5大本地化避坑清单(附实测TTS自然度评分92.7%)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs葡语语音的核心技术架构与本地化本质 ElevenLabs 的葡语语音合成并非简单地在英语模型上叠加音素映射&#xff0c;而是基于多语言联合训练框架构建的端到端神经语音系统&#xff0c;其核心依…...

Display Driver Uninstaller (DDU) 终极指南:显卡驱动彻底清理解决方案

Display Driver Uninstaller (DDU) 终极指南&#xff1a;显卡驱动彻底清理解决方案 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-driv…...

WinDirStat:Windows磁盘空间分析与清理的终极解决方案

WinDirStat&#xff1a;Windows磁盘空间分析与清理的终极解决方案 【免费下载链接】windirstat WinDirStat is a disk usage statistics viewer and cleanup tool for Microsoft Windows 项目地址: https://gitcode.com/gh_mirrors/wi/windirstat WinDirStat是一款专为W…...

DIY蓝牙街机摇杆:从零打造无线复古游戏控制器

1. 项目概述与核心思路作为一个玩了二十多年街机&#xff0c;也折腾了十几年硬件的“老炮儿”&#xff0c;我始终觉得&#xff0c;有些东西的味道是数字模拟不出来的。比如&#xff0c;用键盘或现代手柄玩《拳皇97》或《合金弹头》&#xff0c;总觉得少了点灵魂——那“咔哒咔哒…...