LRU缓存

  1. struct Node{
  2. int key;
  3. int value;
  4. Node* next;
  5. Node* pre;
  6. Node():
  7. key(-1), value(-1), next(nullptr), pre(nullptr){}
  8. explicit Node(int key_, int val_):
  9. key(key_), value(val_), next(nullptr), pre(nullptr){}
  10. Node(int key_, int val_, Node* next_, Node* pre_):
  11. key(key_), value(val_),next(next_), pre(pre_){}
  12. };
  13. class LRUCache {
  14. public:
  15. explicit LRUCache(int capacity):
  16. capacity(capacity){
  17. size = 0; //初始值设为0
  18. head = new Node();
  19. tail = new Node();
  20. head -> next = tail;
  21. tail -> pre = head;
  22. }
  23. int get(int key) {
  24. if(hashMap.end() == hashMap.find(key)){
  25. return -1;
  26. }
  27. auto cur = hashMap[key];
  28. int val = cur -> value;
  29. int key_ = cur -> key;
  30. erase(cur);
  31. cur = new Node(key_, val);
  32. insert(cur);
  33. return val;
  34. }
  35. void put(int key, int value) {
  36. if(hashMap.end() != hashMap.find(key)){
  37. auto cur = hashMap[key];
  38. int val = value;
  39. int key_ = cur -> key;
  40. erase(cur);
  41. cur = new Node(key_, val);
  42. hashMap[key] = cur;
  43. insert(cur);
  44. }else{
  45. auto cur = new Node(key, value);
  46. if(size < capacity){
  47. hashMap[key] = cur;
  48. size++;
  49. }else{
  50. auto lastNode = tail -> pre;
  51. hashMap.erase(lastNode->key);
  52. hashMap[key] = cur;
  53. erase(lastNode);
  54. }
  55. insert(cur);
  56. }
  57. }
  58. void erase(Node *node){
  59. if( node -> pre != nullptr && node -> next != nullptr){
  60. Node *pre = node -> pre;
  61. Node *next = node -> next;
  62. pre -> next = next;
  63. next -> pre = pre;
  64. node -> pre = nullptr;
  65. node -> next = nullptr;
  66. delete(node);
  67. node = nullptr;
  68. }
  69. }
  70. void insert(Node *node){
  71. Node *next = head -> next;
  72. head -> next = node;
  73. next -> pre = node;
  74. node -> pre = head;
  75. node -> next = next;
  76. }
  77. private:
  78. Node *head;
  79. Node *tail;
  80. unordered_map<int, Node*> hashMap;
  81. int capacity;
  82. int size;
  83. };

LRU缓存的更多相关文章

  1. LRU缓存实现(Java)

    LRU Cache的LinkedHashMap实现 LRU Cache的链表+HashMap实现 LinkedHashMap的FIFO实现 调用示例 LRU是Least Recently Used 的 ...

  2. 转: LRU缓存介绍与实现 (Java)

    引子: 我们平时总会有一个电话本记录所有朋友的电话,但是,如果有朋友经常联系,那些朋友的电话号码不用翻电话本我们也能记住,但是,如果长时间没有联系了,要再次联系那位朋友的时候,我们又不得不求助电话本, ...

  3. volley三种基本请求图片的方式与Lru的基本使用:正常的加载+含有Lru缓存的加载+Volley控件networkImageview的使用

    首先做出全局的请求队列 package com.qg.lizhanqi.myvolleydemo; import android.app.Application; import com.android ...

  4. 如何用LinkedHashMap实现LRU缓存算法

    阿里巴巴笔试考到了LRU,一激动忘了怎么回事了..准备不充分啊.. 缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的.LRU这个算法就是把最近一次 ...

  5. 面试挂在了 LRU 缓存算法设计上

    好吧,有人可能觉得我标题党了,但我想告诉你们的是,前阵子面试确实挂在了 RLU 缓存算法的设计上了.当时做题的时候,自己想的太多了,感觉设计一个 LRU(Least recently used) 缓存 ...

  6. Java集合详解5:深入理解LinkedHashMap和LRU缓存

    今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存. 摘要: HashMap和双向链表合二为一即是LinkedHashMap.所谓Linke ...

  7. 04 | 链表(上):如何实现LRU缓存淘汰算法?

    今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是+LRU+缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...

  8. LRU缓存原理

    LRU(Least Recently Used)  LRU是近期最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象. 采用LRU算法的缓存有两种:LrhCache和DisL ...

  9. 链表(上):如何实现LRU缓存淘汰算法?

    一.什么是链表 和数组一样,链表也是一种线性表. 从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构. 链表中的每一个内存块被称为节点Node. ...

  10. [Leetcode]146.LRU缓存机制

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

随机推荐

  1. CF123E Maze(期望dp,树形dp,式子)

    题目大意: 给你一棵树,边权都是1,每一个点有一个是起点的概率和一个是终点的概率,你将以起点为根,开始在树上随机dfs,每到一个点,就会将他的所有儿子随机打乱成序列,然后按照那个随机顺序走完,直到走到 ...

  2. 《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)

    1.简介 在实际自动化测试过程中,我们也避免不了会遇到下拉选择的测试,因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助. 2.select 下拉框 2.1Select ...

  3. Object.create 和 Object.assign

    Object.assign(target, ...source) 1.Object.assign方法只会拷贝源对象自身(不包括原型)的并且可枚举的属性到目标对象,使用源对象的get和目标对象的set, ...

  4. javascript-jquery-更改jquery对象

    在许多情况下,jquery代码所做的事情变成了:生成jquery对象A,操作对jquery象A:更改为jquery对象B,操作jquery对象B:更改为jqueryC,操作jquery对象C..... ...

  5. java定时任务调度框架

    java定时任务目前主要有三种: Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行,但不能在 ...

  6. 【UE4 调试】C++ 几种编译方法和小技巧

    编译方法 Visual Studio 2019 编译 默认编译 UnrealVS 快速编译 Editor 编译 一般 vs 编译完后,Editor会跟着热编译(有声音) 如果发现编译后代码没更新到Ed ...

  7. VS Code Remote SSH设置

    本文翻译自:5 Steps: Setup VS Code for Remote Development via SSH from Windows to Linux system 5个步骤:设置VS代码 ...

  8. 吴恩达课后习题第二课第三周:TensorFlow Introduction

    目录 第二课第三周:TensorFlow Introduction Introduction to TensorFlow 1 - Packages 1.1 - Checking TensorFlow ...

  9. Java:重载和重写

    Java:重载和重写 对 Java 中的 重载和重写 这个概念,做一个微不足道的小小小小结 重载 重载:编译时多态,同一个类中的同名的方法,参数列表不同,与返回值无关. 有以下几点: 方法名必须相同: ...

  10. 安装多个版本的MySQL

    安装多个版本的MySQL 之前在PC机上安装了 MySQL 5.5 后续发现了窗口函数,而窗口函数是 MySQL8 以后才支持的,故在本地又安装了一个 MySQL 8 安装MySQL 5.5 进入my ...