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

146.LRU缓存-图解LRU

        LRU缓存是一种满足最近最少使用约束的数据结构。我们可以用一个简单的例子来理解:假设你有一摞书,最多只能放capacity本。当你需要找一本书时,如果书在摞中,就返回它的版本(即key-value);如果不在,就返回-1。当你想放入一本新书时,如果这本书已经存在,就更新它的版本号;如果不存在,就把新书放在最上面。如果书的数量超过了capacity,就把最下面那本书移出。

                                                        

        那么,在这个例子中,我们主要用到了哪些操作呢?又该用什么数据结构来实现呢?由于题目要求get()和put()的时间复杂度为O(1),并且需要同时存放key-value,还要删除最久未使用的元素,因此可以使用双向链表来解决。具体来说,我们主要用到了以下操作:

        1.删除

        将一个节点删除

        2.将节点放在最前面

 

        3.快速找出要找的节点

        使用哈希表,用key与节点作映射

 

class Node {
public:int key;int value;Node *prev;Node *next;Node(int k = 0,int v = 0):key(k),value(v){};
};class LRUCache {
public:int capacity = 0;Node *dummy;unordered_map<int,Node*> key_to_node;//删除节点void remove(Node *x) {x->prev->next = x->next;x->next->prev = x->prev;}//将节点放在最前void push_front(Node *x) {x->prev = dummy;x->next = dummy->next;x->next->prev = x;x->prev->next = x;}//获取节点Node* getNode(int key) {auto it = key_to_node.find(key);if (it == key_to_node.end()) {return nullptr;}Node *node = key_to_node[key];remove(node);push_front(node);return node;}LRUCache(int capacity) : capacity(capacity),dummy(new Node()) {dummy->next = dummy;dummy->prev = dummy;}int get(int key) {Node *node = getNode(key);return node ? node->value : -1;}void put(int key, int value) {Node *node = getNode(key);if (node) {node->value = value;return;}key_to_node[key] = node = new Node(key,value);push_front(node);if (capacity < key_to_node.size()) {//最久未使用节点Node *back_node = dummy->prev;key_to_node.erase(back_node->key);remove(back_node);//释放内存delete back_node;}}
};

        时间复杂度:O(1)

        空间复杂度:O(min(p,capacity),p为put的次数

http://www.xdnf.cn/news/8130.html

相关文章:

  • Axure项目实战:智慧运输平台后台管理端-运单管理
  • 华为Cangjie编程技术深度解析(续篇1)
  • 手机入网时长查询接口:精准风控与用户运营的智能利器
  • 【软考向】Chapter 3 数据结构
  • C++线程池----基于生产者消费者模式队列实现
  • 线性代数:AI大模型的数学基石
  • 遨游三防科普:三防平板是什么?有什么特殊功能?
  • ObservableCollection序列化,和监听链表内元素变化
  • nginx动态控制前端版本
  • FPGA通信之VGA
  • 塔能科技:工厂能耗精准节能全方位解决方案
  • 高效缓存设计的哲学
  • 基于科大讯飞语音识别组件(Vue3)
  • PyInstaller 如何在mac电脑上生成在window上可执行的exe文件
  • AI 招聘系统科普:如何辨别真智能与伪自动化
  • 什么是VR实景?有哪些高价值场景?
  • 微信小程序学习基础:从入门到精通
  • 5G 网络中 DNN 的深度解析:从基础概念到核心应用
  • NMEA定位测试,硬件验证
  • 【工具】Quicker/VBA|PPT 在指定位置添加参考线
  • [Memory] 01.QEMU 内存虚拟化概览
  • Python实现PDB文件预处理
  • uniapp使用sse连接后端,接收后端推过来的消息
  • Rust 学习笔记:关于生命周期的练习题
  • Win11怎样禁止程序开机启动
  • 车载以太网网络测试-27【SOME/IP-SD简述】
  • MySQL中实现大数据量的快速插入
  • 游戏引擎学习第304天:构建与遍历图
  • 第六届电子通讯与人工智能国际学术会议(ICECAI 2025)
  • 语音控制设备的仿真/语音调试