LRU缓存机制—leetcode146
运用你所掌握的数据结构,设计和实现一个 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
思路:用一个链表记录当前缓存中所有的键值对,并且每次新来的访问都对链表进行重新调整,把最近访问的键值对放到链表头部。然后为了快速访问缓存中的值,维护一个map,key是实际数据的key,对应的value指向该key在链表中的位置节点,这样每次添加键值对时,先判断map中是否有该key,若有则修改链表中对应节点的value;若没有则把该键值对添加到链表头部,去除链表尾部超过规定长度的节点,并在map中添加key以及对应的链表节点指针。
class LRUCache {
public:LRUCache(int capacity) {size = capacity;}int get(int key) {auto it = hash.find(key);if(it == hash.end()) return -1;cache.splice(cache.begin(), cache, it->second);return it->second->second;}void put(int key, int value) {auto it = hash.find(key);if(it != hash.end()){it->second->second = value;cache.splice(cache.begin(), cache, it->second);}else{cache.insert(cache.begin(), make_pair(key, value));hash[key] = cache.begin();if(cache.size() > size){hash.erase(cache.back().first);cache.pop_back();}}}
private:unordered_map<int, list<pair<int, int>>::iterator> hash;list<pair<int, int>> cache;int size;
};/*** 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);*/
LRU缓存机制—leetcode146相关推荐
- 实现 LRU 缓存机制
实现 LRU 缓存机制 文章目录 实现 LRU 缓存机制 一.什么是 LRU 算法 二.LRU 算法描述 三.LRU 算法设计 四.代码实现 一.什么是 LRU 算法 LRU 就是一种缓存淘汰策略.( ...
- 146. LRU 缓存机制
146. LRU 缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 . 实现 LRUCache 类: LRUCache(int capacity) 以正整数作为容量 ...
- LRU缓存机制,你想知道的这里都有
概述 LRU是Least Recently Used的缩写,译为最近最少使用.它的理论基础为 "最近使用的数据会在未来一段时期内仍然被使用,已经很久没有使用的数据大概率在未来很长一段时间仍然 ...
- LRU 缓存机制实现:哈希表 + 双向链表
算法详解 LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对. 双向链表按照被使用的顺序存储了这些键值对,靠近头部的键值对是最近使用的,而靠近尾部的 ...
- Java实现 LeetCode 146 LRU缓存机制
146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...
- Leetcode 146. LRU缓存机制【哈希表 [哈希表存储每个元素在双向链表中的指针]+双向链表】
文章目录 问题描述 解题报告 实验代码 参考资料 问题描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . ...
- LeetCode实战:LRU缓存机制
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Design and ...
- LeetCode第 146 号问题: LRU 缓存机制
题目描述 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (ke ...
- 面试高频题: LRU缓存机制实现
题目 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (key ...
最新文章
- Linux程序包管理之RPM
- 学习笔记Spark(二)—— Spark集群的安装配置
- 2018年4月java自考真题,全国2018年4月自考互联网数据库考试真题
- mysql子分区多少层_MYSQL子分区修剪
- 变量和简单数据类型(一)
- 结对开发——返回一个整数数组中最大子数组的和 (首尾相接版)
- [Jmeter] 基本使用的总结
- github pages_在GitHub Pages上发布组织主页
- 使用vmstat和iostat命令进行Linux性能监控
- 【华为云技术分享】为什么说物联网平台是城市数字化的必备底座
- MySQL 宣布停止使用 master、slave!
- SSE/AVX/AVX2汇编技巧
- 超详细的Latex快速基础入门 (第二节)【关于latex命令的一些知识】
- 想要体验《失控玩家》里Guy的视角,299美元还远远不够
- [敏捷开发培训] Scrum 和 Kanban
- 再探传说──啤酒与尿布的故事
- 阿里云同步gcr.io的镜像
- 直播软件搭建直播服务架构
- 产品经理 - 路漫漫其修远兮
- 《武道神尊》12.29上线链游玩家|放置挂机、轻松修真