LRU(Least Recently Used)

出发点:在页式存储管理中,如果一页很长时间未被访问,则它在最近一段时间内也不会被访问,即时间局部性,那我们就把它调出(置换出)内存,相反的,如果一个数据刚刚被访问过,那么该数据很大概率会在未来一段时间内访问。

可以使用栈、队列、链表来简单实现,在InnoDB中,使用适应性hash,来实现热点页的查找(因为快速)。

1. 用栈(数组模拟)简单实现访页逻辑:

  1. #include <iostream>
  2. using namespace std;
  3.  
  4. void conduct(int Size, int Num, int A[]);//处理函数
  5. void print(int a[], int num);//输出函数
  6.  
  7. int main()
  8. {
  9. int stack_size, num, i, acess[];
  10. cout << "输入栈空间:" ;
  11. cin >> stack_size;
  12. cout << "输入进程数(Max=100):" ;
  13. cin >> num;
  14.  
  15. cout << "输入进程访页顺序:" ;
  16. for(i=; i<num; i++)
  17. {
  18. cin >> acess[i];
  19. }
  20.  
  21. conduct(stack_size, num, acess);
  22.  
  23. return ;
  24. }
  25.  
  26. void conduct(int Size, int Num, int A[])
  27. {
  28. int j, k, Stack[Size];
  29. for(j=; j<Size; j++)
  30. {
  31. cout << "进入:" << A[j] <<endl;
  32. Stack[j]=A[j];//先处理前几个元素
  33. }
  34. int locate;bool flag;
  35. for(j=Size; j<Num; j++)
  36. {
  37. flag=false;
  38. for(k=; k<Size; k++)
  39. {
  40. if(Stack[k]==A[j])
  41. {
  42. flag=true;
  43. locate=k;
  44. }
  45. }
  46. if(flag==true)//有重复
  47. {
  48. cout << "重复进程:" << A[j] <<endl;
  49. cout << "取出再压栈" <<endl;
  50. int tempp;
  51. for(k=locate; k<Size; k++)
  52. {
  53. Stack[k]=Stack[k+];
  54. }
  55. Stack[Size-]=A[j];
  56. cout << "压栈完成" <<endl;
  57. cout << "当前顺序:";
  58.  
  59. print(Stack, Size);
  60. }
  61. else
  62. {
  63. cout << "非重复,压栈:" << A[j] <<endl;
  64. for(k=; k<Size-; k++)
  65. {
  66. Stack[k]=Stack[k+];
  67. }
  68. Stack[Size-]=A[j];
  69. cout << "置换完成。" <<endl;
  70. cout << "当前顺序:";
  71. print(Stack, Size);
  72. }
  73. }
  74. }
  75.  
  76. void print(int a[], int num)
  77. {
  78. int k;
  79. for(k=; k<num; k++)
  80. {
  81. cout << a[k] << " ";
  82. }
  83. cout << endl;
  84. }
      Code::Blocks 17.12 运行通过!

结果:

2. 使用lis容器实现LRU逻辑

  1. #include <iostream>
  2. #include <list>
  3. #include <vector>
  4. using namespace std;
  5.  
  6. class LRU
  7. {
  8. public:
  9. LRU();
  10. ~LRU();
  11. void insret(int x);
  12. void printQ();
  13. private:
  14. list<int> lst;
  15. int count;//当前页数
  16. int max_size = ;//最大容纳页数
  17. };
  18.  
  19. LRU::LRU()
  20. {
  21. this->count = ;
  22. }
  23.  
  24. LRU::~LRU()
  25. {
  26. }
  27.  
  28. //插入算法,先查找,找到先删除再插入;未找到,直接插入
  29. void LRU::insret(int x)
  30. {
  31. cout << "访页:" << x << " ";
  32. auto res = find(lst.begin(), lst.end(), x);
  33. if (res != lst.end())
  34. {
  35. cout << "(exist)" << " ";
  36. lst.erase(res);
  37. lst.push_front(x);
  38. }
  39. else
  40. {
  41. lst.push_front(x);
  42. this->count++;
  43. }
  44. if (this->count > this->max_size)
  45. {
  46. lst.pop_back();
  47. this->count--;
  48. }
  49.  
  50. printQ();
  51. }
  52.  
  53. //打印list
  54. void LRU::printQ()
  55. {
  56. list<int>::iterator it = this->lst.begin();
  57. cout << "当前队列/热点页:";
  58. for (; it != lst.end(); it++)
  59. {
  60. cout << *it << " ";
  61. }
  62. cout << "\ndone. size -- " << this->count << " " << " max_size -- " << this->max_size << endl << endl;
  63. }
  64.  
  65. int main()
  66. {
  67. LRU lru;
  68. vector<int> test = {, , , , , , , , , , , , , , , };
  69. for (int i : test)
  70. lru.insret(i);
  71. return ;
  72. }

结果:

LRU(最近最少使用淘汰算法)基本实现的更多相关文章

  1. Golang 随机淘汰算法缓存实现

    缓存如果写满, 它必须淘汰旧值以容纳新值, 最近最少使用淘汰算法 (LRU) 是一个不错的选择, 因为你如果最近使用过某些值, 这些值更可能被保留. 你如果构造一个比缓存限制还长的循环, 当循环最后的 ...

  2. 缓存淘汰算法--LRU算法

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...

  3. 缓存淘汰算法---LRU

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...

  4. 【转】缓存淘汰算法系列之1——LRU类

    原文地址:http://www.360doc.com/content/13/0805/15/13247663_304901967.shtml 参考地址(一系列关于缓存的,后面几篇也都在这里有):htt ...

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

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

  6. 缓存淘汰算法---LRU转

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...

  7. LRU算法---缓存淘汰算法

    计算机中的缓存大小是有限的,如果对所有数据都缓存,肯定是不现实的,所以需要有一种淘汰机制,用于将一些暂时没有用的数据给淘汰掉,以换入新鲜的数据进来,这样可以提高缓存的命中率,减少磁盘访问的次数. LR ...

  8. 淘汰算法 LRU、LFU和FIFO

    含义: FIFO:First In First Out,先进先出LRU:Least Recently Used,最近最少使用 LFU:Least Frequently Used,最不经常使用 以上三者 ...

  9. 数据结构与算法之美 06 | 链表(上)-如何实现LRU缓存淘汰算法

    常见的缓存淘汰策略: 先进先出 FIFO 最少使用LFU(Least Frequently Used) 最近最少使用 LRU(Least Recently Used) 链表定义: 链表也是线性表的一种 ...

随机推荐

  1. 解决使用display:inline-block时元素间隔问题

    在写个人博客页时出现了一个百思不得其解的问题,不知道为什么出现以下情况: 可以看到,下面的a标签中出现了一个间隔,怎么都去不掉,查阅资料后发现,问题原因如下: 1.第一种解决办法,去掉HTML元素中的 ...

  2. Asp.NetCoreWebApi图片上传接口(二)集成IdentityServer4授权访问(附源码)

    写在前面 本文地址:http://www.cnblogs.com/yilezhu/p/9315644.html 作者:yilezhu 上一篇关于Asp.Net Core Web Api图片上传的文章使 ...

  3. vue 项目实战 (生命周期钩子)

    开篇先来一张图 下图是官方展示的生命周期图 Vue实例的生命周期钩子函数(8个)        1. beforeCreate             刚 new了一个组件,无法访问到数据和真实的do ...

  4. C++版 - 剑指offer 面试题24:二叉搜索树BST的后序遍历序列(的判断) 题解

    剑指offer 面试题24:二叉搜索树的后序遍历序列(的判断) 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true.否则返回false.假设输入的数组的任意两个 ...

  5. 项目ITP(四) javaweb http json 交互 in action (服务端 spring 手机端 提供各种工具类)勿喷!

    前言 系列文章:[传送门] 洗了个澡,准备写篇博客.然后看书了.时间 3 7 分.我慢慢规律生活,向目标靠近.  很喜欢珍惜时间像叮当猫一样 正文 慢慢地,二维码实现签到将要落幕了.下篇文章出二维码实 ...

  6. [NewLife.XCode]功能设置

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...

  7. Xpath 获取html文档的标签

    1.html page content: <div class="mnr-c _yE"> <div class="_kk _wI">In ...

  8. React 中无用但可以装逼的知识

    最近看了Dan Abramov的一些博客,学到了一些React的一些有趣的知识.决定结合自己的理解总结下.这些内容可能对你实际开发并没有什么帮助,不过这可以让你了解到更多React底层实现的内容以及为 ...

  9. 第6章 LVM详解

    6.1 LVM相关概念和机制 LVM(Logical Volume Manager)可以让分区变得弹性,可以随时随地的扩大和缩小分区大小,前提是该分区是LVM格式的. lvm需要使用的软件包为lvm2 ...

  10. spring boot(三) 集成mybatis

    前言 还记得之前我们写接口也是基于SpringMVC+MyBatis环境下,项目入手就需要N个配置文件,N个步骤才能实现,不但繁琐,而且时间长了xml配置文件太多,难以维护.现在基于spring bo ...