LeetCode 146. LRU缓存机制(哈希链表)

文章目录

    • 1. 题目信息
    • 2. 解题
      • 2.1 手动实现list
      • 2.2 使用内置list

1. 题目信息

运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。

进阶:

你是否可以在 O(1) 时间复杂度内完成这两种操作?

示例:LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // 返回  1
cache.put(3, 3);    // 该操作会使得密钥 2 作废
cache.get(2);       // 返回 -1 (未找到)
cache.put(4, 4);    // 该操作会使得密钥 1 作废
cache.get(1);       // 返回 -1 (未找到)
cache.get(3);       // 返回  3
cache.get(4);       // 返回  4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lru-cache
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 类似题目:LeetCode 460. LFU缓存

2.1 手动实现list

要 put 和 get 方法的时间复杂度为 O(1),这个数据结构要:查找快,插入快,删除快,有顺序之分

  • 有顺序之分,区分最近使用的和久未使用的数据
  • 容量满了要删除最后一个数据
  • 访问时要把数据插入到队头。

哈希表查找快,但数据无顺序
链表有顺序之分,插入删除快,但查找慢。
结合一下以上两者的优点。

  • LRU 缓存算法的核心数据结构就是哈希链表双向链表哈希表的组合体。

借一张图表示下哈希链表。
在这里插入图片描述
在这里插入图片描述

class Node
{
public:int key, value;Node *prev, *next;Node(int k, int v):prev(NULL),next(NULL){key = k;value = v;}
};
class DoubleList
{Node *head, *tail;int len;
public:DoubleList():len(0){head = new Node(0,0);tail = new Node(0,0);head->next = tail;tail->prev = head;}void addAtHead(Node* newnode){newnode->next = head->next;newnode->prev = head;head->next->prev = newnode;head->next = newnode;len++;}void delNode(Node *del){del->prev->next = del->next;del->next->prev = del->prev;len--;}Node* delLast()//删除最后的节点,并返回该节点{if(tail->prev == head)return NULL;Node *last = tail->prev;delNode(last);return last;}int size(){return len;}};
class LRUCache {unordered_map<int, Node*> m;DoubleList cache;int cap;
public:LRUCache(int capacity) {cap = capacity;}int get(int key) {if(m.find(key) == m.end())return -1;int val = m[key]->value;put(key, val);return val;}void put(int key, int value) {Node *newnode = new Node(key,value);if(m.find(key) != m.end())//找到节点,移至前面{cache.delNode(m[key]);cache.addAtHead(newnode);m[key] = newnode;}else//没找到key{if(cap == cache.size()){Node *last = cache.delLast();m.erase(last->key);}cache.addAtHead(newnode);m[key] = newnode;}}
};/*** 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);*/

2.2 使用内置list

class LRUCache {list<int> cache;int cap;unordered_map<int,int> kv;unordered_map<int,list<int>::iterator> kPos;
public:LRUCache(int capacity) {cap = capacity;}int get(int key) {if(!kv.count(key))return -1;put(key,kv[key]);return kv[key];}void put(int key, int value) {if(kv.count(key)){cache.erase(kPos[key]);cache.push_front(key);kPos[key] = cache.begin();kv[key] = value;}else{if(cap == cache.size()){int lastkey = cache.back();cache.pop_back();kv.erase(lastkey);}kv[key] = value;cache.push_front(key);kPos[key] = cache.begin();}}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务系列:服务注册与发现的实现原理、及实现优劣势比较

服务注册与发现的来源 首先&#xff0c;服务注册与发现是来自于微服务架构的产物。 在传统的服务架构中&#xff0c;服务的规模处于运维人员的可控范围内。当部署服务的多个节点时&#xff0c;一般使用静态配置的方式实现服务信息的设定。而在微服务应用中&#xff0c;服务实例…

EMNLP 2020论文分析:知识图谱增强语言模型或是未来的发展趋势!

文 | Michael Galkin源 | AI科技评论在EMNLP 2020的论文投递中&#xff0c;知识图谱的研究热度不减&#xff0c;并成为继续推动NLP发展的重要动力之一。在EMNLP 2020中&#xff0c;知识图谱领域有了哪些最新研究进展呢&#xff1f;作者从中选出了30篇文章&#xff0c;对未来2-3…

如何通过反射来解决AlertDialog标题由于字数过多显示不全的问题

转载前请标明出处:http://blog.csdn.net/sahadev_ 先上一下示例图&#xff1a; 这是默认状态下&#xff1a;这是通过反射后修改的结果&#xff1a; 在解决这个问题之前首先需要了解一下AlertDialog的基本构造&#xff0c;所以先从源码看起&#xff1a; 想要知道为什么显示不…

LeetCode 292. Nim 游戏

文章目录1. 题目信息2. 解题1. 题目信息 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a;桌子上有一堆石头&#xff0c;每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人&#xff0c;每一步都是最优解。 编写一个函数…

配送A/B评估体系建设实践

2019年5月6日&#xff0c;美团点评正式推出新品牌“美团配送”&#xff0c;发布了美团配送新愿景&#xff1a;“每天完成一亿次值得信赖的配送服务&#xff0c;成为不可或缺的生活基础设施。”现在&#xff0c;美团配送已经服务于全国400多万商家和4亿多用户&#xff0c;覆盖28…

ListView原理简单介绍(着重介绍getView被调用的一系列过程)

今天出去面试&#xff0c;被面试官问到一个问题&#xff0c;说是如果使用 LayoutInflate.inflate(int resource, ViewGroup root, boolean attachToRoot);这个方法与AbsListView的实现类结合使用的话&#xff0c;会出现什么问题&#xff0c;先看简单的使用过程&#xff1a; Ove…

一人之力,刷爆三路榜单!信息抽取竞赛夺冠经验分享

文 | JayLou娄杰在现如今的NLP竞赛中&#xff0c;信息抽取&#xff08;IE&#xff09;任务已占据半壁江山。来&#xff0c;让我们看看今年的一些IE竞赛都有啥&#xff1a;看到如此众多的IE竞赛&#xff0c;心动的JayJay抽空参加了CHIP2020&#xff08;中国健康信息处理大会&…

pkuseg:一个多领域中文分词工具包

pkuseg简单易用&#xff0c;支持细分领域分词&#xff0c;有效提升了分词准确度。 目录 主要亮点编译和安装各类分词工具包的性能对比使用方式相关论文作者常见问题及解答主要亮点 pkuseg具有如下几个特点&#xff1a; 多领域分词。不同于以往的通用中文分词工具&#xff0c;此…

积木Sketch Plugin:设计同学的贴心搭档

| A consistent experience is a better experience.——Mark Eberman | 一致的体验是更好的体验。——Mark Eberman 《摘自设计师的16句名言》 背景 1.UI一致性项目 积木&#xff08;Tangram&#xff09;Sketch插件源于美团外卖UI的一致性项目&#xff0c;该项目自2019年5月份…

简单讲述一下Intent的传值过程

昨晚带女友Android入门&#xff0c;她本是照着一本书敲得&#xff0c;可以运行&#xff0c;后来她自己凭思维自己写了一个&#xff0c;然后出现了值没有传过来的问题&#xff0c;然后简单的了解了一下Intent是如何传递数据的。 我们的例子是这样的&#xff1a; 由A Activity通…

何恺明团队:stop gradient是孪生网络对比学习成功的关键

文 | Happy源 | 极市平台本文是FAIR的陈鑫磊&何恺明大神在无监督学习领域又一力作&#xff0c;提出了一种非常简单的表达学习机制用于避免表达学习中的“崩溃”问题&#xff0c;从理论与实验角度证实了所提方法的有效性&#xff1b;与此同时&#xff0c;还侧面证实了对比学…

美团无人配送CVPR2020论文CenterMask解读

计算机视觉技术是实现自动驾驶的重要部分&#xff0c;美团无人配送团队长期在该领域进行着积极的探索。不久前&#xff0c;高精地图组提出的CenterMask图像实例分割算法被CVPR2020收录&#xff0c;本文将对该方法进行介绍。 CVPR的全称是IEEE Conference on Computer Vision an…

如何使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率

在平常的开发中经常会有很多列表页面&#xff0c;每做一个列表页就需要创建这个布局文件那个Adapter适配器文件等等一大堆与之相关的附属的不必要的冗余文件。如果版本更新迭代比较频繁&#xff0c;如此以往&#xff0c;就会使项目工程变得无比庞大臃肿。 如果看过这篇文章或者…

从信息检索顶会CIKM'20看搜索、推荐与计算广告新进展

文 | 谷育龙Eric源 | 搜索推荐广告排序艺术我是谷育龙Eric&#xff0c;研究方向有深度学习、搜索推荐&#xff0c;喜欢为大家分享深度学习在搜索推荐广告排序应用的文章。CIKM作为信息检索、数据挖掘等领域的国际一流会议&#xff0c;每年都有很多搜索推荐广告领域的精彩论文。…

复杂风控场景下,如何打造一款高效的规则引擎

| 在互联网时代&#xff0c;安全已经成为企业的命脉。美团信息安全团队需要采用各种措施和手段来保障业务安全&#xff0c;从而确保美团平台上的用户和商户利益不会受到侵害。 本文主要介绍了美团在打造自有规则引擎Zeus&#xff08;中文名“宙斯”&#xff09;的过程中&#x…

Android消息队列图片记录

很早之前为了给学生讲明白整个消息队列是怎么个情况&#xff0c;于是大概阅读了一下消息队列的整个工作过程&#xff0c;鉴于网上大部分都是文字说明&#xff0c;没有一个图例&#xff0c;于是做出了下面这张图&#xff0c;权当作以后复习之用&#xff0c;也供大家学习参考&…

Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!

原文连接&#xff1a;https://blog.csdn.net/u011535541/article/details/83379151 转载自 Git使用教程 预警&#xff1a;因为详细&#xff0c;所以行文有些长&#xff0c;新手边看边操作效果出乎你的预料&#xff09;一&#xff1a;Git是什么&#xff1f; Git是目前世界上最先…

主动学习入门篇:什么是主动学习?有哪些具体应用

文 | 淘系技术部 初类来源 | 知乎在大数据和算力的助力下&#xff0c;深度学习掀起了一波浪潮&#xff0c;在许多领域取得了显著的成绩。以监督学习为主的深度学习方法&#xff0c;往往期望能够拥有大量的标注样本进行训练&#xff0c;模型能够学到更多有价值的知识&#xff08…

LeetCode 59. 螺旋矩阵 II LeetCode 54. 螺旋矩阵

文章目录1. 题目信息2. LeetCode 59 解题3. LeetCode 54. 螺旋矩阵4.《剑指Offer》面试题291. 题目信息 给定一个正整数 n&#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的正方形矩阵。 示例:输入: 3 输出: [[ 1, 2, 3 ],[ 8, 9, 4 ],[ 7…

如何查看Activity任务栈以及dumpsys_activity命令的简要使用及介绍

今天看到淘宝客户端的某个页面效果&#xff0c;效果是在两个Activity中做动画&#xff0c;为了知道究竟是不是在同一个Activity中做的效果&#xff0c;就必须采取一种手段来知道是不是同一个Activity.描述一下这个动画效果&#xff1a;列表页面点击图片&#xff0c;图片会滑动到…