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

LRU 缓存结构

文章目录

  • LRU
  • 实现

LRU

  • 优先去除最久没有访问到的数据。

实现

  • 通过组合哈希表(Hash Table)和双向链表(Doubly Linked List)实现 LRU 缓存。并且以 O(1) 的时间复杂度执行 get 和 put 操作
  • 核心是对节点的新增、访问都会让节点移动到双向链表头部,当容量超过时,直接删除尾部节点即可
class LRUCache {constructor(capacity) {// 容量this.capacity = capacity;this.cache = new Map();// 用于记录访问顺序的双向链表,声明空的头节点和尾节点this.head = {};this.tail = {};// 头和尾相连this.head.next = this.tail;this.tail.prev = this.head;}get(key) {const map = this.cache;if (!map.has(key)) {return -1;}// 每次把使用的节点放到链表的头部const node = map.get(key);this._moveToHead(node);return node.value;}put(key, value) {const map = this.cache;// 如果 key 已存在,更新并移动到双向链表头部if (map.has(key)) {const node = map.get(key);node.value = value;this._moveToHead(node);} else {if (map.size >= this.capacity) {// 缓存容量已满,移除尾部节点const leastUsedKey = this.tail.prev.key;this._removeNode(this.tail.prev);map.delete(leastUsedKey);}// 创建新节点,和更新 HashMap,并移动到链表头部const newNode = this._addNode({ key, value });map.set(key, newNode);}}// 双向链表删除节点_removeNode(node) {node.prev.next = node.next;node.next.prev = node.prev;}// 删除双向链表旧节点位置,然后移动到头部_moveToHead(node) {this._removeNode(node);this._addNode(node);}// 添加节点并移动到头部_addNode(node) {node.prev = this.head;node.next = this.head.next;this.head.next.prev = node;this.head.next = node;return node;}
}// 使用示例
const cache = new LRUCache(2);
cache.put(1, 10);
console.log(cache.get(1)); // 10
cache.put(2, 20);
cache.put(3, 30);
console.log(cache.get(1)); // -1

相关文章:

LRU 缓存结构

文章目录 LRU实现 LRU 优先去除最久没有访问到的数据。 实现 通过组合哈希表(Hash Table)和双向链表(Doubly Linked List)实现 LRU 缓存。并且以 O(1) 的时间复杂度执行 get 和 put 操作核心是对节点的新增、访问都会让节点移动…...

DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

1.手动实现登录框&#xff1b; ---mychat.h---头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> //打印信息 #include <QIcon> //图标 #include <QPushButton> //按钮 #include <QLineEdit> //行编辑器类 #in…...

25.8 matlab里面的10中优化方法介绍—— 拉各朗日乘子法求最优化解(matlab程序)

1.简述 拉格朗日乘子法&#xff1a; 拉格朗日乘子法&#xff08;Lagrange multipliers&#xff09;是一种寻找多元函数在一组约束下的极值的方法。通过引入拉格朗日乘子&#xff0c;可将有 变量与 约束条件的最优化问题转化为具有变量的无约束优化问题求解 举个例子&#xff…...

2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) | EI Compendex, Scopus双检索

会议简介 Brief Introduction 2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) 会议时间&#xff1a;2023年9月22日-24日 召开地点&#xff1a;中国杭州 大会官网&#xff1a;ECNLPIR 2023-2023 Eurasian Conference on Natural Language Processing and Information Retr…...

Python - 嵌入式数据库Sqlite3的基本使用

SQLite是一种轻量级的嵌入式关系型数据库管理系统&#xff0c;而Python标准库中提供了与SQLite交互的模块&#xff0c;sqlite3。下面是一个Python 3中使用sqlite3模块的详细示例与解析。 import sqlite3 # 创建或连接数据库 conn sqlite3.connect(example.db) # 创建一个…...

VB制作网页自动填表

VB制作简单模拟器教程入门版 第一讲 如何用VB编程打开一个网页&#xff1a; 由于是为做模拟器做铺垫&#xff0c;所以就不介绍别的方法&#xff0c;只介绍一种最简单的用webbrowser控件实现&#xff08;实际是其他的方法我还没有学会&#xff09;。 下面我们就开始步入模…...

Kotlin 和 Java对比,具体代码分析

目录 一、语法比较二、案列分析 Kotlin 和 Java 都是广泛使用的编程语言&#xff0c;它们有一些共同点&#xff0c;例如都追求面向对象编程&#xff0c;但也有许多不同之处。下面是 Kotlin 和 Java 之间的一些比较&#xff1a; 一、语法比较 声明变量&#xff1a;Kotlin 使用 …...

目标检测之3维合成

现在有一系列的图片&#xff0c;图片之间可以按照z轴方向进行排列。图片经过了目标检测&#xff0c;输出了一系列的检测框&#xff0c;现在的需求是将检测框按类别进行合成&#xff0c;以在3维上生成检测结果。 思路&#xff1a;将图片按照z轴方向排列&#xff0c;以z轴索引作…...

【playbook】Ansible的脚本----playbook剧本

Ansible的脚本----playbook剧本 1.playbook剧本组成2.playbook剧本实战演练2.1 实战演练一&#xff1a;给被管理主机安装Apache服务2.2 实战演练二&#xff1a;使用sudo命令将远程主机的普通用户提权为root用户2.3 实战演练三&#xff1a;when条件判断指定的IP地址2.4 实战演练…...

PySpark基本操作:如何查看源码

方法一&#xff1a; from pyspark.mllib.tree import GradientBoostedTrees import inspectsource_code inspect.getsource(GradientBoostedTrees) print(source_code) 方法二&#xff1a; GradientBoostedTrees — PySpark 3.4.1 documentation (apache.org) 在官网中&…...

HCIP——OSPF的防环机制

OSPF的防环机制 一、域间防环二、域内防环有向图转化1、有向图的画法2、示例&#xff1a; 三、SPF算法 OSPF将整个OSPF域划分为多个区域&#xff0c;区域内部通过拓扑信息计算路由&#xff0c;区域间传递路由信息&#xff0c;实现全网可达。OSPF防环机制主要是体现在域内防环和…...

安全基础 --- 正则表达式

正则表达式是表达文本模式的方法 正则表达式&#xff08;Regular Expression&#xff09;&#xff0c;简称为正则或Regex&#xff0c;是一个用来描述、匹配和操作字符串的工具。 &#xff08;1&#xff09;限定字符 限定字符多用于重复匹配次数 常用限定字符&#xff1a; 语…...

【vue】vue面试高频问题之-$nextTick的作用和使用场景

nextTick的作用和使用场景 vue中的nextTick主要用于处理数据动态变化后&#xff0c;DOM还未及时更新的问题&#xff0c;用nextTick就可以获取数据更新后最新DOM的变化 api文档 Vue.nextTick( [callback, context] ) 参数&#xff1a; {Function} [callback]{Object} [context]…...

MySQL学习笔记之SQL语句执行过程查看

文章目录 参数使能查看最近一条SQL执行过程查看profiling打开开后&#xff0c;所有SQL语句执行耗时查看某一条SQL的执行过程指定要查看的性能选项查看所有性能选项 参数使能 以select语句为例&#xff0c;首先打开profile参数&#xff1a; mysql> set profiling 1; Query…...

如何以毫秒精度,查看系统时间以及文件的创建时间

用 cmd 查看系统的时间&#xff1a; powershell -command "(Get-Date -UFormat %Y-%m-%d %H:%M:%S).toString() . ((Get-Date).millisecond)" 用 XYplorer 查看文件的精确创建时间&#xff08;含30天试用&#xff09;&#xff1a; XYplorer - File Manager for …...

基于机器学习的情绪识别算法matlab仿真,对比SVM,LDA以及决策树

目录 1.算法理论概述 2.部分核心程序 3.算法运行软件版本 4.算法运行效果图预览 5.算法完整程序工程 1.算法理论概述 情绪识别是一种重要的情感分析任务&#xff0c;旨在从文本、语音或图像等数据中识别出人的情绪状态&#xff0c;如高兴、悲伤、愤怒等。本文介绍一种基于…...

jMeter使用随记

参数化BodyData 先制作参数文件 再设置一个csv data set config 最后在body data里面写上参数${xxxxx}...

[语义分割] DeepLab v3(Cascaded model、ASPP model、两种ASPP对比、Multi-grid、训练细节)

Rethinking Atrous Convolution for Semantic Image Segmentation 论文地址&#xff1a;Rethinking Atrous Convolution for Semantic Image SegmentationPytorch 实现代码&#xff1a;pytorch_segmentation/deeplab_v3 这是一篇 2017 年发表在CVPR上的文章。相比 DeepLab V2 有…...

css - Media Query

使用bootstrap的grid system可以在一个较为粗糙的范围得到较好的响应性&#xff0c;但是通过viewport可以看到网站在具体哪个像素点处变得丑陋&#xff0c;再通过css media query来精细调整网页布局。 可以通过media query来提高网页移动响应能力。...

9.python设计模式【外观模式】

内容&#xff1a;为子系统中的一组接口提供一个一致的界面&#xff0c;外观模式定义了一个高层接口&#xff0c;这个接口使得这一个子系统更加容易使用。 角色&#xff1a; 外观&#xff08;facade&#xff09;子类系统&#xff08;subsystem classes&#xff09; UML图 举…...

Webpack5 CopyPlugin的作用

在Webpack 5中&#xff0c;CopyPlugin是一个插件&#xff0c;用于将文件或目录从源位置复制到构建目录中。它的作用是帮助开发人员在构建过程中将静态文件&#xff08;如图片、字体等&#xff09;直接复制到输出目录&#xff0c;而无需经过任何处理。 CopyPlugin并不是必须的&…...

kafka服务端允许生产者发送最大消息体大小

1、kafka config服务端配置文件server.properties server.properties中加上的message.max.bytes配置&#xff0c;我目前设置为5242880&#xff0c;即5MB&#xff0c;可以根据实际情况增大。 message.max.bytes5242880 在生产者端配置max.request.size&#xff0c;这是单个消息…...

台阶型Nim游戏博弈论

台阶型Nim游戏 题目 https://www.acwing.com/problem/content/894/ 现在&#xff0c;有一个 n n n 级台阶的楼梯&#xff0c;每级台阶上都有若干个石子&#xff0c;其中第 i i i 级台阶上有 a i a_i ai​ 个石子( i ≥ 1 i \ge 1 i≥1)。 两位玩家轮流操作&#xff0c;每…...

NestJS 的 中间件 学习

基本概念 中间件是在路由处理程序之前调用的函数。中间件函数可以访问请求和响应对象。在程序中我们可以让多个中间件串起来一起使用&#xff0c;当多个中间件一起使用时我们可以使用next()调用下一个中间件。 中间件主要是可以实现如下功能&#xff1a; 执行任何代码更改请…...

搭建自己第一个golang程序

概念&#xff1a; golang 和 java有些类似&#xff0c;配置好环境就可以直接编写运行了&#xff1b;这里分两种&#xff1a; 一.shell模式 创建一个go类型的文件 往里面编写代码 二.开发工具模式 这里的开发工具 我选用goland package mainimport "fmt"func mai…...

Mysql加锁过程

1、背景 MySQL/InnoDB的加锁分析&#xff0c;一直是一个比较困难的话题。我在工作过程中&#xff0c;经常会有同事咨询这方面的问题。同时&#xff0c;微博上也经常会收到MySQL锁相关的私信&#xff0c;让我帮助解决一些死锁的问题。本文&#xff0c;准备就MySQL/InnoDB的加锁问…...

财经界杂志财经界杂志社财经界编辑部2023年第19期目录

《财经界》投稿邮箱&#xff1a;cnqikantg126.com(注明投稿“《财经界》”) ●崔编辑Q Q &#xff1a;695548262 微信号&#xff1a;f99832970 名刊名著_国内外名刊名著 财经名刊名著 李少鹏 ;王海蕴; 6-7 发改委专线 六方面发力 看中国经济形势&#xff0c;既要看准当…...

Linux常用命令——dpkg-split命令

在线Linux命令查询工具 dpkg-split Debian Linux中将大软件包分割成小包 补充说明 dpkg-split命令用来将Debian Linux中的大软件包分割成小软件包&#xff0c;它还能够将已分割的文件进行合并。 语法 dpkg-split(选项)(参数)选项 -S&#xff1a;设置分割后的每个小文件最…...

常见的二十种软件测试方法详解

一.单元测试&#xff08;模块测试&#xff09; 单元测试是对软件组成单元进行测试。其目的是检验软件组成单位的正确性。测试对象是&#xff1a;模块。 对模块进行测试&#xff0c;单独的一个模块测试&#xff0c;属于静态测试的一类 测试阶段&#xff1a;编码后或者编码前&…...

Python(一)

要做到坚韧不拔&#xff0c;最要紧的是坚持到底。——陀思妥耶夫斯基 2023 6 14~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ --根据你自己的操作系统下载对应的。 -- pyhton 文档 --交互方式 使用的工具 --如何启动工具 -- 交互式方式一般在数据分析中…...