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

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的次数

相关文章:

  • 点云(point cloud):自动驾驶的“三维扫描图“
  • 使用web3工具结合fiscobcos网络部署调用智能合约
  • 相机标定与图像处理涉及的核心坐标系
  • 零基础弄懂 ngx_http_slice_module分片缓存加速
  • Ubuntu/Linux 服务器上调整系统时间(日期和时间)
  • Python基础学习-Day32
  • 详解受约束的强化学习(二、理解学习)
  • 介绍一下 MVCC
  • 08 接口自动化-用例管理框架pytest之fixtrue,conftest.py,allure报告以及logo定制
  • Linux 输出输入重定向、tee命令详解
  • C# 实现轻量化数据库SQLite在工业中上的应用
  • JVM——内存模型
  • [Git] 认识 Git 的三大区域 文件的修改和提交
  • github cli主要用途,优势,和git的区别
  • 2025淘宝最新DSR评分计算方式
  • WebSocket 从入门到进阶实战
  • 【计算机网络】网络层——IP协议
  • 生成树协议(STP)配置详解:避免网络环路的最佳实践
  • Ubuntu Desktop 24.04 常用软件安装步骤
  • 【C++20新特性】ranges::sort()使用方法,优势,注意点
  • 自己设计一个网站首页/google浏览器网页版
  • 长治网站建设龙采科技技术支持/百度服务中心投诉
  • 如何做网站的教程视频/收录入口在线提交
  • 如何自己做网页链接/东莞seo网络推广专
  • 哪里学网站建设与管理/运营推广怎么做
  • 南阳医疗网站建设公司/8大营销工具