C++实现LRU算法
利用双向链表和哈希表实现LRU算法
双向链表
使用双向链表可以快速删除和添加元素,来移动最近使用的节点,将最近使用的节点保存到双向链表的尾端。快速的put值和value。
哈希表
使用哈希表可以快速的查找节点。快速get关键值为key的value。
LRU算法
实现 LRUCache 类:
- LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存
- int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
- void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组「关键字-值」。当缓存容量达到上限时,它应该在写入新数据之前删除最久未使用的数据值,从而为新的数据值留出空间。
最终代码
#include <vector>
#include <iostream>
#include <unordered_map>
#include <memory>
class Node {
public:int key, value;std::shared_ptr<Node> prev, next;Node(int _key, int _value) {key = _key;value = _value;prev = nullptr;next = nullptr;}
};class DoubleList {
public:std::shared_ptr<Node> head, tail;int size;DoubleList() {head = std::make_shared<Node>(0, 0);tail = std::make_shared<Node>(0, 0);head->next = tail;tail->prev = head;size = 0;}void addLast(const std::shared_ptr<Node>& x) {x->prev = tail->prev;x->next = tail;tail->prev->next = x;tail->prev = x;size++;}void remove(const std::shared_ptr<Node>& x) {x->prev->next = x->next;x->next->prev = x->prev;size--;}std::shared_ptr<Node> removeFirst() {if (head->next == tail) {return nullptr;}auto first = head->next;remove(first);return first;}int getSize() const {return size;}
};class LRUCache {
public:DoubleList cache{};std::unordered_map<int, std::shared_ptr<Node>> map{};int cap;LRUCache(int capacity) {cap = capacity;}int get(int key) {if (map.count(key) == 0) {return -1;}makeRecently(key);return map.at(key)->value;}void put(int key, int value) {if (map.count(key)) {deleteKey(key);addRecently(key, value);return;}if (cap == cache.getSize()) {removeLeastRecently();}addRecently(key, value);}private:void makeRecently(int key) {auto x = map.at(key);cache.remove(x);cache.addLast(x);}void addRecently(int key, int value) {auto x = std::make_shared<Node>(key, value);cache.addLast(x);map[key] = x;}void deleteKey(int key) {auto x = map.at(key);cache.remove(x);map.erase(key);}void removeLeastRecently() {auto x = cache.removeFirst();int key = x->key;map.erase(key);}};
参考:算法就像搭乐高:带你手撸 LRU 算法
C++实现LRU算法相关推荐
- LRU算法 -- 链表 完整实现
LRU算法(Least Recently Used) 算是我们经常遇到的一种淘汰算法,其中内存管理模块进行内存页回收时有用到,针对不经常使用的内存页,LRU淘汰策略能够将该内存页回收给操作系统. 属于 ...
- 漫画:什么是LRU算法?
本期封面作者:A17 ----- 两个月前 ----- 用户信息当然是存在数据库里.但是由于我们对用户系统的性能要求比较高,显然不能每一次请求都去查询数据库. 所以,小灰在内存中创建了一个哈希表作 ...
- 【腾讯三面】你能现场写一下LRU算法吗?
" 金三银四,又到了换工作的黄金期.各位小伙伴们都准备好了吗? " 这句话大家是不是最近已经要看吐了呢? 每当这个时候,就证明招聘旺季又来啦~ 春招.校招.社招-- 那你真的准备好 ...
- LRU算法确定最后使用时间的顺序
LRU算法是经常采用的页面置换算法,并被认为是相当好的,但是存在如何实现它的问题.LRU算法需要实际硬件的支持.其问题是怎么确定最后使用时间的顺序,对此有两种可行的办法: 1.计数器. 2.栈.
- java 最少使用(lru)置换算法_「面试」LRU了解么?看看LinkedHashMap如何实现LRU算法...
以下内容均是本人原创,希望你看完之后能有更多更深入的了解,欢迎关注➕ 问题:使用Java完成一个简单的LRU算法 什么是LRU算法 LRU(Least Recently Used),也就是最近最少使用 ...
- Android图片缓存之Lru算法
前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...
- 使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法
一,LRU算法介绍 LRU是内存分配中"离散分配方式"之分页存储管理方式中用到的一个算法.每个进程都有自己的页表,进程只将自己的一部分页面加载到内存的物理块中,当进程在运行过程中, ...
- 2.LRU算法实现 [C++]
LRU算法实现原理: 最近最久未使用页面置换算法(LRU) 当需要淘汰某一页时,选择在最近一段时间里最久没有被使用过的页淘汰. 其基本原理为:如果某一个页面被访问了,它很可能还要被访问:相反,如果它长 ...
- 操作系统之存储管理——FIFO算法和LRU算法
操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...
- 编写程序来模拟计算机LRU算法,操作系统-页式虚拟存储管理程序模拟.doc
实 验3: 页式虚拟存储管理程序模拟 实验目的: 编写程序来模拟计算机的两种调度方式: (1)先进先出算法 (2)最近最少使用算法 程序设计 FIFO() FIFO() LRU() Msize加1 S ...
最新文章
- 【c语言】蓝桥杯基础练习 数列特征
- python django并发访问挂掉,解决django高并发时数据库连接量过大的问题(实现连接池的方法)...
- Tensorflow:在Tensorflow的不同版本中如何实现Xavier参数权重初始化
- 远程Service的显示 / 隐式启动
- 牛客网_PAT乙级1002_数字分类 (20)
- 第4章 同余问题《信息学奥赛一本通 提高篇》
- All Flags in April
- java类的方法 作用 属性_JAVA:类和对象(秒懂版)
- [转]麻省理工学院(MIT)研究生学习指导[上]
- 哥写的不是代码,是寂寞
- python处理era5_python批量下载EC—ERA5再分析资料
- linux bootloader启动流程,技术|Linux 的启动流程详解
- dojo实现省份地市级联---省份数据源
- 全集成隔离DC-DC转换器CA-IS3105W简介
- 01-12.产品经理入门到精通(一)
- # Android12 wifi和4G同时使用
- D. Relatively Prime Graph codeforces 1009 D
- 自定义皮肤,你值得拥有!
- [歌词生成] 基于LSTM语言模型和seq2seq序列模型:数据爬取、模型思想、网络搭建、歌词生成
- 2022世界杯不扩军!国足教练:机会来了
热门文章
- iphone5运行linux,使用linux和iphone 5的HFP配置文件
- 我的世界手机版无限连接服务器,《我的世界手机版》怎么连接服务器 怎么进别人的服务器...
- Android应用隐藏包名
- CentOS 配置 yum 源
- 【面经】Shopee 深度学习算法工程师(实习) 一面凉经
- 学生成绩字典、获取最高分科目分数python_Python高效编程技巧
- ibm cloud属于paas吗_研华成立WISE-Cloud智慧云平台联盟
- python opencv图像拼接
- CentOS如何增加虚拟内存
- 2012服务器网站环境配置,服务器2012环境变量配置