利用双向链表和哈希表实现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算法相关推荐

  1. LRU算法 -- 链表 完整实现

    LRU算法(Least Recently Used) 算是我们经常遇到的一种淘汰算法,其中内存管理模块进行内存页回收时有用到,针对不经常使用的内存页,LRU淘汰策略能够将该内存页回收给操作系统. 属于 ...

  2. 漫画:什么是LRU算法?

    本期封面作者:A17 -----  两个月前  ----- 用户信息当然是存在数据库里.但是由于我们对用户系统的性能要求比较高,显然不能每一次请求都去查询数据库. 所以,小灰在内存中创建了一个哈希表作 ...

  3. 【腾讯三面】你能现场写一下LRU算法吗?

    " 金三银四,又到了换工作的黄金期.各位小伙伴们都准备好了吗? " 这句话大家是不是最近已经要看吐了呢? 每当这个时候,就证明招聘旺季又来啦~ 春招.校招.社招-- 那你真的准备好 ...

  4. LRU算法确定最后使用时间的顺序

    LRU算法是经常采用的页面置换算法,并被认为是相当好的,但是存在如何实现它的问题.LRU算法需要实际硬件的支持.其问题是怎么确定最后使用时间的顺序,对此有两种可行的办法: 1.计数器. 2.栈.

  5. java 最少使用(lru)置换算法_「面试」LRU了解么?看看LinkedHashMap如何实现LRU算法...

    以下内容均是本人原创,希望你看完之后能有更多更深入的了解,欢迎关注➕ 问题:使用Java完成一个简单的LRU算法 什么是LRU算法 LRU(Least Recently Used),也就是最近最少使用 ...

  6. Android图片缓存之Lru算法

    前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...

  7. 使用java.util.LinkedList模拟实现内存页面置换算法--LRU算法

    一,LRU算法介绍 LRU是内存分配中"离散分配方式"之分页存储管理方式中用到的一个算法.每个进程都有自己的页表,进程只将自己的一部分页面加载到内存的物理块中,当进程在运行过程中, ...

  8. 2.LRU算法实现 [C++]

    LRU算法实现原理: 最近最久未使用页面置换算法(LRU) 当需要淘汰某一页时,选择在最近一段时间里最久没有被使用过的页淘汰. 其基本原理为:如果某一个页面被访问了,它很可能还要被访问:相反,如果它长 ...

  9. 操作系统之存储管理——FIFO算法和LRU算法

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  10. 编写程序来模拟计算机LRU算法,操作系统-页式虚拟存储管理程序模拟.doc

    实 验3: 页式虚拟存储管理程序模拟 实验目的: 编写程序来模拟计算机的两种调度方式: (1)先进先出算法 (2)最近最少使用算法 程序设计 FIFO() FIFO() LRU() Msize加1 S ...

最新文章

  1. 【c语言】蓝桥杯基础练习 数列特征
  2. python django并发访问挂掉,解决django高并发时数据库连接量过大的问题(实现连接池的方法)...
  3. Tensorflow:在Tensorflow的不同版本中如何实现Xavier参数权重初始化
  4. 远程Service的显示 / 隐式启动
  5. 牛客网_PAT乙级1002_数字分类 (20)
  6. 第4章 同余问题《信息学奥赛一本通 提高篇》
  7. All Flags in April
  8. java类的方法 作用 属性_JAVA:类和对象(秒懂版)
  9. [转]麻省理工学院(MIT)研究生学习指导[上]
  10. 哥写的不是代码,是寂寞
  11. python处理era5_python批量下载EC—ERA5再分析资料
  12. linux bootloader启动流程,技术|Linux 的启动流程详解
  13. dojo实现省份地市级联---省份数据源
  14. 全集成隔离DC-DC转换器CA-IS3105W简介
  15. 01-12.产品经理入门到精通(一)
  16. # Android12 wifi和4G同时使用
  17. D. Relatively Prime Graph codeforces 1009 D
  18. 自定义皮肤,你值得拥有!
  19. [歌词生成] 基于LSTM语言模型和seq2seq序列模型:数据爬取、模型思想、网络搭建、歌词生成
  20. 2022世界杯不扩军!国足教练:机会来了

热门文章

  1. iphone5运行linux,使用linux和iphone 5的HFP配置文件
  2. 我的世界手机版无限连接服务器,《我的世界手机版》怎么连接服务器 怎么进别人的服务器...
  3. Android应用隐藏包名
  4. CentOS 配置 yum 源
  5. 【面经】Shopee 深度学习算法工程师(实习) 一面凉经
  6. 学生成绩字典、获取最高分科目分数python_Python高效编程技巧
  7. ibm cloud属于paas吗_研华成立WISE-Cloud智慧云平台联盟
  8. python opencv图像拼接
  9. CentOS如何增加虚拟内存
  10. 2012服务器网站环境配置,服务器2012环境变量配置