LRU算法实现

server/2025/3/27 15:45:06/

基于双链表的实现

需要维护的是两个:

  1. 负责达到快速查找作用的unodered_map<key, DLinkList*>,key存放的是键,值存放的是这个键在cache里面的地址,这样查找的时候就能快速找到键并通过值访问地址获取其val了
  2. 负责记录具体信息和使用记录的cache多个DlinkList链接起来的链表。推荐创建一个虚拟头和尾结点,方便管理,越靠近头就越是最近用过,越靠近链表尾部,就代表越久未使用过。
struct DLinkedNode{  //使用记录的双向链表int key_, value_;DLinkedNode* pre_;DLinkedNode* next_;DLinkedNode():key_(0),value_(0), pre_(nullptr), next_(nullptr){}DLinkedNode(int key, int value):key_(key), value_(value),pre_(nullptr),next_(nullptr){}
};class LRUCache {
private:unordered_map<int,DLinkedNode*> cache; //缓存,只是为了更快速的找到DLinkedNode* head;DLinkedNode* tail;size_t size;size_t cap;public:LRUCache(int capacity): cap(capacity),size(0){head = new DLinkedNode();tail = new DLinkedNode();head->next_ = tail;tail->pre_ = head;}int get(int key) {if(!cache.count(key)) return -1;DLinkedNode* node = cache[key];moveToHead(node);return temp->value_;}void put(int key, int value) {if(!cache.count(key)){ //cache里没有就加结点,cache只是为了快速找到DLinkedNode* node = new DLinkedNode(key,value);addToHead(node);cache[key] = node;size++;if(size > cap){DLinkedNode* removed = removeTail();cache.erase(removed->key_);delete removed;size--;}}else{ //加入的存在了,把它挪到使用记录双向链表的第一个DLinkedNode* node = cache[key];temp->value_ = value;moveToHead(node);}}//一些操作双向链表记录的操作方法void addToHead(DLinkedNode* node){node->pre_ = head;node->next_ = head->next_;head->next_->pre_ = node;head->next_ = node;}void removeNode(DLinkedNode* node){node->pre_->next_ = node->next_;node->next_->pre_ = node->pre_;}void moveToHead(DLinkedNode* node){removeNode(node);addToHead(node);}DLinkedNode* removeTail(){DLinkedNode* node = tail->pre_;removeNode(node);return node;}};/*** Your LRUCache object will be instantiated and called as such:* LRUCache* obj = new LRUCache(capacity);* int param_1 = obj->get(key);* obj->put(key,value);*/

http://www.ppmy.cn/server/179176.html

相关文章

【docker】docker-compose安装RabbitMQ

docker-compose安装RabbitMQ 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09;2、启动mq3、访问mq4、查看服务器映射目录5、踩坑5.1、权限不足 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09; versi…

一个简单的用C#实现的分布式雪花ID算法

雪花ID是一个依赖时间戳根据算法生成的一个Int64的数字ID&#xff0c;一般用来做主键或者订单号等。以下是一个用C#写的雪花ID的简单实现方法 using System; using System.Collections.Concurrent; using System.Diagnostics;public class SnowflakeIdGenerator {// 配置常量p…

数据库 第一章 MySql基础(1)

目录 数据库概述 定义 常见的数据库产品&#xff1a; Mysql数据库 MySQL的常用命令 安装可视化客户端工具 sql DDL 创建,删除数据库 数据库表的基本概念 设 计 表 设计表(数据类型) 字符 日期 整数 浮点 长文本字符 主键&#xff1a; 约束: 创建表语法: 删…

Solr-搜索引擎-入门到精通

以下是对 Apache Solr 的简介及其常用语法的快速入门指南&#xff1a; 一、Solr 是什么&#xff1f; • 核心定位&#xff1a;Apache Solr 是一个基于 Lucene 的高性能、开源的搜索平台&#xff0c;支持全文检索、分词、高亮、聚合统计等功能。 • 核心功能&#xff1a; • 全…

【视频】m3u8相关操作

1、视频文件转m3u8 1.1 常用命令 1)默认只保留 5 个ts文件 ffmpeg -i input.mp4 -start_number 0 -hls_time 10 -hls_list_size 0 -f hls stream1.m3u82)去掉音频 -an,保留全部ts文件 ffmpeg -i input.mp4 -vf scale=640:480 -an -start_number 0 -hls_time 10 -hls_lis…

23种设计模式-观察者(Observer)设计模式

观察者设计模式 &#x1f6a9;什么是观察者模式&#xff1f;&#x1f6a9;观察者设计模式的特点&#x1f6a9;观察者设计模式的结构&#x1f6a9;观察者设计模式的优缺点&#x1f6a9;观察者设计模式的Java实现&#x1f6a9;代码总结&#x1f6a9;总结 &#x1f6a9;什么是观察…

人工智能与无人机:无人机的进步与应用技术详解

人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;是一门研究、开发用于模拟、延伸和扩展人类智能的理论、方法、技术及应用系统的新技术科学。 无人机&#xff0c;全称为无人驾驶飞行器&#xff08;UAV&#xff09;&#xff0c;也称为无人机器人、…

Java 基础入门代码示例解析

在 Java 编程的学习过程中&#xff0c;理解函数&#xff08;方法&#xff09;的使用以及简单系统功能的实现是非常重要的基础。本文将对一系列 Java 代码进行详细解析&#xff0c;这些代码涵盖了菜单驱动的功能选择、数据查询以及简单的 RBAC&#xff08;基于角色的访问控制&am…