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

【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)

文章目录

  • 一、定义
  • 二、LRU模拟实现
  • 二、代码实现


一、定义

LRU是Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法。
Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间来放新内容。LRU Cache 的替换原则就是将最近最少使用的内容替换掉。

二、LRU模拟实现

146.LRU缓存
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

下面我们就借力扣的这道题来简单实现一个

题目中要求我们以O(1)的时间复杂度来完成,查找的话我们首先肯定会想到哈希表,但又涉及一个问题,我们查找完之后还需要更新一下刚刚查找数据的位置,将这个数据置为是新的数据,我们如何解决查找完改变数据的标识也做到O(1)呢?

要保持高效实现O(1)的put和get,那么使用双向链表和
哈希表的搭配是最高效和经典的
。使用双向链表是因为双向链表可以实现任意位置O(1)的插入和删除,使用哈希表是因为哈希表的增删查改也是O(1)。
在这里插入图片描述

需要注意:这里最巧的设计就是将unordered_map的value type放成list<pair<int, int>>::iterator,因为这样,当get一个已有的值以后,就可以直接找到key在list中对应的iterator,然后将这个值移动到链表的头部,保持LRU。

二、代码实现

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
#include<list>
#include<unordered_map>using namespace std;class LRUCache {public:LRUCache(int capacity):_capacity(capacity){}int get(int key) {auto ret = _hashMap.find(key);//在hash中找到了key存的地方if (ret != _hashMap.end()) {LtIter it = ret->second;//将it移动到_LRUList的头部_LRUList.splice(_LRUList.begin(), _LRUList, it);return it->second;}else {return -1;}}void put(int key, int value) {auto ret = _hashMap.find(key);//原来没有key的数据则添加if (ret == _hashMap.end()) {//LRU满了,删除最近最少使用的就是链表尾部if (_capacity == _hashMap.size()) {pair<int, int>back = _LRUList.back();_hashMap.erase(back.first);//删哈希里面//链表里面k存的和哈希的是同一个key_LRUList.pop_back();//删链表尾部}//放入新的数据到链表头部_LRUList.push_front(make_pair(key, value));//哈希表中添加_hashMap[key] = _LRUList.begin();}//原来有key的数据则更新else {LtIter it = ret->second;it->second = value;//将这个位置移到链表头部_LRUList.splice(_LRUList.begin(), _LRUList, it);}}private://链表存kv结构//k为key值,v为我们要更新的数据typedef list<pair<int, int>>::iterator LtIter;//重命名链表迭代器int _capacity; // 容量大小,超过容量则换出,保持LRU//_LRUList假设链表头部为最近使用的,尾部为最近最少使用list<pair<int, int>> _LRUList;//hash中存放的是key值与对应链表迭代器的的映射关系unordered_map<int, LtIter>_hashMap;};

相关文章:

【数据结构】LRU缓存的简单模拟实现(leetcode力扣146LRU缓存)

文章目录 一、定义二、LRU模拟实现二、代码实现 一、定义 LRU是Least Recently Used的缩写&#xff0c;意思是最近最少使用&#xff0c;它是一种Cache替换算法。 Cache的容量有限&#xff0c;因此当Cache的容量用完后&#xff0c;而又有新的内容需要添加进来时&#xff0c; 就…...

基于电商场景的高并发RocketMQ实战-Commitlog基于内存的高并发写入优化、基于JVM offheap的内存读写分离机制

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 【11来了】文章导读地址&#xff1a;点击查看文章导读&#xff01; &#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f341;&#x1f3…...

工具系列:TensorFlow决策森林_(3)使用dtreeviz可视化

文章目录 介绍设置安装 TF-DF 和 dtreeviz导入库 可视化分类树加载、清洗和准备数据分割训练/测试集并训练模型训练一个随机森林分类器显示决策树检查叶节点统计信息决策树如何对实例进行分类特征空间划分 可视化回归树加载、清洗和准备数据分割训练/测试集并训练模型训练一个随…...

【算法学习】斐波那契数列模型-动态规划

前言 我在算法学习过程中&#xff0c;针对斐波那契数列模型的动态规划的例题进行了一个整理&#xff0c;并且根据标准且可靠一点的动态规划解题思路进行求解类似的动归问题&#xff0c;来达到学习和今后复习的必要。 所谓的斐波那契数列模型&#xff0c;即当前状态的值等于前两…...

ES的安装和RestClient的操作

目录 初识elasticsearch 什么是elasticsearch elasticsearch的发展 Lucene的优缺点 elasticsearch的优势 倒排索引 es与mysql的概念对比 文档 索引 概念对比 架构 安装es 安装kibana 安装ik分词器 分词器 安装ik分词器 ik分词器的拓展和停用词典 操作索引库…...

访问者模式(Visitor)

访问者模式(Visitor Pattern)是一种将算法与对象结构分离的行为型设计模式。这种模式主要用于对一个由许多不同类型的对象构成的复杂对象结构(如组合结构)进行操作,而不需要对这些对象的类进行修改。 访问者模式涉及以下几个角色: 访问者(Visitor):为每一个具体元素类…...

ATTCK红队评估一

一、环境搭建 主机 ip地址 win7外网服务器&#xff08;两张网卡&#xff09; 外网&#xff1a;192.168.92.135 内网&#xff1a;192.168.52.143 server2003域成员主机 内网&#xff1a;192.168.52.141 server2008域空主机 内网&#xff1a;192.168.52.138 kali攻击机 …...

W5500-EVB-Pico评估版介绍

文章目录 1 概述2 板载资源2.1 硬件规格2.2 硬件规格2.3 工作条件 3 参考资料3.2 原理图3.3 尺寸图 (单位 : mm)3.4 参考例程 4 硬件协议栈优势 1 概述 W5500-EVB-Pico是基于树莓派RP2040和完全硬连线TCP/IP控制器W5500的微控制器开发板-基本上与树莓派Pico板相同&#xff0c;但…...

单聊和群聊

TCP协议单聊 服务端&#xff1a; import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Vec…...

Swift 检测 iCloud状态

Show me the code: func isICloudContainerAvailable() -> Bool {if let _ FileManager.default.ubiquityIdentityToken {return true} else {return false} }推荐一下刚上线的 App 熊猫小账本&#xff0c;里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App&…...

使用Windi CSS(基于vue-cli)

1、先创建vue项目 利用脚手架vue-cli创建&#xff0c;根据需求设置vue版本、babel等&#xff0c;无特别要求直接用默认的vue2或vue3就行 vue create 项目名 2、运行vue项目&#xff0c;利用vue-cli安装Windi CSS 官网指导&#xff1a;Vue CLI 集成 | Windi CSS 我的经历&a…...

操作无法完成(错误 0x000006ba),Windows 11 PDF打印机无法使用解决办法

操作无法完成(错误 0x000006ba)&#xff0c;Windows 11 PDF打印机无法使用解决办法 解决方式一 先重启一次电脑&#xff0c;看看是否可以解决问题。 解决方式二 重新启动 Printer Spooler 服务...

Settings中电池选项-Android13

Settings中电池选项-Android13 1、设置中界面2、电池计算2.1 充电时间计算2.1.1 BatteryUsageStats获取2.1.2 BatteryStatsImpl计算 2.2 电池剩余使用时间2.2.1 Estimate获取2.2.2 BatteryStatsImpl计算 3、电池信息来源4、命令模拟* 日志 [电池]Android 9.0 电池未充电与充电字…...

解密 Java ForEach 提前终止问题

目录 前言&#xff1a;场景复现分析与解决方案解决方案详解总结 前言&#xff1a; 你是否曾在使用 Java 8 的 forEach 迭代集合时遇到过提前终止循环的问题&#xff1f;在这篇博客中&#xff0c;我们将深入探讨这一问题&#xff0c;并提供多种解决方案。通过场景复现、分析源码…...

7_js_dom编程入门1

Objective&#xff08;本课目标&#xff09; 掌握获取页面元素的常用方法 掌握事件触发案例 能够区分innerText和innerHTML的区别 综合案例训练 1 DOM 介绍 1.1 什么是DOM 文档对象模型&#xff08;Document Object Model&#xff0c;简称DOM&#xff09;&#xff0c;是 …...

使用 Elasticsearch 检测抄袭 (一)

作者&#xff1a;Priscilla Parodi 抄袭可以是直接的&#xff0c;涉及复制部分或全部内容&#xff0c;也可以是释义的&#xff0c;即通过更改一些单词或短语来重新表述作者的作品。 灵感和释义之间是有区别的。 即使你得出类似的结论&#xff0c;也可以阅读内容&#xff0c;获得…...

STM32 cubeMX 直流电机控制风扇转动

本文使用的是 HAL 库。 文章目录 前言一、直流电机介绍二、直流电机原理图三、直流电机控制方法四、STM32CubeMX 配置直流电机五、代码编写总结 前言 实验开发板&#xff1a;STM32F051K8。所需软件&#xff1a;keil5 &#xff0c; cubeMX 。实验目的&#xff1a;了解 直流电机…...

我在 VSCode 插件里接入了 ChatGPT,解决了Bug无法定位的难题

作为一名软件开发者&#xff0c;我时常面临着代码中Bug的定位和解决问题。这个过程往往既费时又充满挑战。然而&#xff0c;最近我在我的VSCode插件中接入了ChatGPT&#xff0c;这个决定彻底改变了我处理Bug的方式。 Bug&#xff1a;开发者的噩梦 在开发过程中&#xff0c;遇…...

学Java的第四天

一、switch语句 switch (表达式) { case 1: 语句体1; break; case 2: 语句体2; break; ... default: 语句体n1; break; } 首先计算表达式的值&#xff0c;然后和case 比较&#xff0c;有对应的值就执行对应的语句&#xff0c;遇到 break 就结束。 最后如果所有的cas…...

[内功修炼]函数栈帧的创建与销毁

文章目录 1:什么是函数栈帧2:理解函数栈帧能解决什么问题呢3:函数栈帧的创建与销毁的解析3.1:什么是栈3.2:认识相关寄存器与汇编指令相关寄存器相关汇编指令 3.3 解析函数栈帧的创建和销毁3.3.1 预备知识3.3.2 详细解析一:调用main函数,为main函数开辟函数栈帧First:push前push…...

MySQL 8.0 等保合规实战:手把手配置开源审计插件 server_audit.so

MySQL 8.0 等保合规审计插件实战指南 在数字化转型浪潮中&#xff0c;数据库安全审计已成为企业合规运营的刚需。对于使用MySQL 8.0的企业而言&#xff0c;如何在不影响性能的前提下满足等保2.0三级及以上对数据库审计的要求&#xff0c;是每位DBA和安全工程师必须掌握的技能。…...

requests - 简单好用的HTTP请求库

一、什么是requests&#xff1f; requests 是一个用于发送HTTP请求的 Python 库。 它可以帮助你&#xff1a; 轻松发送GET、POST、PUT、DELETE等请求处理Cookie、会话等复杂性自动解压缩内容处理国际化域名和URL 二、应用场景 requests 广泛应用于以下实际场景&#xff1a;…...

【PolarCTF2026年春季挑战赛】GET

直接上传一个php试试文件名后缀双写可以绕过可以解析&#xff0c;我们上传一句话木马提示出现了$_POST[cmd]那么用下面的webshell&#xff0c;避免POST和cmd一起出现<?php $x $_POST; eval($x[cmd]); ?>上传成功&#xff0c;访问一下得到flag{73121d2832f501293a2e661…...

新手零基础入门:跟着快马生成的互动教程完成jdk17下载安装与第一个程序

作为一名Java初学者&#xff0c;第一次接触JDK安装可能会觉得有些迷茫。最近我在InsCode(快马)平台上尝试了一个JDK17安装教程项目&#xff0c;整个过程比我预想的要简单很多。下面就把我的学习笔记分享给大家&#xff0c;希望能帮助到同样刚入门的朋友。 JDK17下载步骤 首先需…...

UniApp静态资源分包实战:除了图片500错误,你的分包策略真的优化到位了吗?

UniApp静态资源分包深度优化&#xff1a;从500报错到全平台兼容方案 在UniApp开发中&#xff0c;随着项目规模扩大&#xff0c;静态资源管理逐渐成为性能优化的关键瓶颈。许多开发者初次接触分包策略时&#xff0c;往往只关注基础配置而忽略资源加载的深层逻辑&#xff0c;直到…...

告别重复造轮子:用快马AI一键生成esp8266连接阿里云IoT的高效代码模块

最近在做一个智能家居项目&#xff0c;需要用esp8266连接阿里云IoT平台。作为一个经常和物联网设备打交道的开发者&#xff0c;我发现每次新项目都要重复写类似的连接代码&#xff0c;既浪费时间又容易出错。这次尝试用InsCode(快马)平台的AI辅助生成代码模块&#xff0c;效率提…...

保姆级教程:在银河麒麟V10上,用Qt Installer Framework打包Unity游戏(附快捷方式配置)

银河麒麟V10系统下Unity游戏打包全流程实战&#xff1a;从安装配置到桌面快捷方式优化 在国产操作系统生态逐渐成熟的今天&#xff0c;银河麒麟V10作为主流国产Linux发行版之一&#xff0c;为独立游戏开发者提供了新的发布平台选择。本文将深入讲解如何利用Qt Installer Frame…...

文墨共鸣大模型智能体(Agent)开发入门:构建自动化任务执行系统

文墨共鸣大模型智能体&#xff08;Agent&#xff09;开发入门&#xff1a;构建自动化任务执行系统 你有没有想过&#xff0c;让AI不仅能回答问题&#xff0c;还能像人一样思考、规划&#xff0c;并主动使用工具去完成任务&#xff1f;比如&#xff0c;你告诉它“帮我查一下北京…...

快速上手FNF PsychEngine:3大核心功能完全指南

快速上手FNF PsychEngine&#xff1a;3大核心功能完全指南 【免费下载链接】FNF-PsychEngine Engine originally used on Mind Games mod 项目地址: https://gitcode.com/gh_mirrors/fn/FNF-PsychEngine FNF PsychEngine是一款专为《周五夜放克》&#xff08;Friday Nig…...

WarcraftHelper终极指南:解锁魔兽争霸3现代硬件潜力的完整方案

WarcraftHelper终极指南&#xff1a;解锁魔兽争霸3现代硬件潜力的完整方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为经典的即时战…...