LRU(最近最少使用淘汰算法)基本实现
LRU(Least Recently Used)
出发点:在页式存储管理中,如果一页很长时间未被访问,则它在最近一段时间内也不会被访问,即时间局部性,那我们就把它调出(置换出)内存,相反的,如果一个数据刚刚被访问过,那么该数据很大概率会在未来一段时间内访问。
可以使用栈、队列、链表来简单实现,在InnoDB中,使用适应性hash,来实现热点页的查找(因为快速)。
1. 用栈(数组模拟)简单实现访页逻辑:
#include <iostream>
using namespace std; void conduct(int Size, int Num, int A[]);//处理函数
void print(int a[], int num);//输出函数 int main()
{
int stack_size, num, i, acess[];
cout << "输入栈空间:" ;
cin >> stack_size;
cout << "输入进程数(Max=100):" ;
cin >> num; cout << "输入进程访页顺序:" ;
for(i=; i<num; i++)
{
cin >> acess[i];
} conduct(stack_size, num, acess); return ;
} void conduct(int Size, int Num, int A[])
{
int j, k, Stack[Size];
for(j=; j<Size; j++)
{
cout << "进入:" << A[j] <<endl;
Stack[j]=A[j];//先处理前几个元素
}
int locate;bool flag;
for(j=Size; j<Num; j++)
{
flag=false;
for(k=; k<Size; k++)
{
if(Stack[k]==A[j])
{
flag=true;
locate=k;
}
}
if(flag==true)//有重复
{
cout << "重复进程:" << A[j] <<endl;
cout << "取出再压栈" <<endl;
int tempp;
for(k=locate; k<Size; k++)
{
Stack[k]=Stack[k+];
}
Stack[Size-]=A[j];
cout << "压栈完成" <<endl;
cout << "当前顺序:"; print(Stack, Size);
}
else
{
cout << "非重复,压栈:" << A[j] <<endl;
for(k=; k<Size-; k++)
{
Stack[k]=Stack[k+];
}
Stack[Size-]=A[j];
cout << "置换完成。" <<endl;
cout << "当前顺序:";
print(Stack, Size);
}
}
} void print(int a[], int num)
{
int k;
for(k=; k<num; k++)
{
cout << a[k] << " ";
}
cout << endl;
}
Code::Blocks 17.12 运行通过!
结果:

2. 使用lis容器实现LRU逻辑
#include <iostream>
#include <list>
#include <vector>
using namespace std; class LRU
{
public:
LRU();
~LRU();
void insret(int x);
void printQ();
private:
list<int> lst;
int count;//当前页数
int max_size = ;//最大容纳页数
}; LRU::LRU()
{
this->count = ;
} LRU::~LRU()
{
} //插入算法,先查找,找到先删除再插入;未找到,直接插入
void LRU::insret(int x)
{
cout << "访页:" << x << " ";
auto res = find(lst.begin(), lst.end(), x);
if (res != lst.end())
{
cout << "(exist)" << " ";
lst.erase(res);
lst.push_front(x);
}
else
{
lst.push_front(x);
this->count++;
}
if (this->count > this->max_size)
{
lst.pop_back();
this->count--;
} printQ();
} //打印list
void LRU::printQ()
{
list<int>::iterator it = this->lst.begin();
cout << "当前队列/热点页:";
for (; it != lst.end(); it++)
{
cout << *it << " ";
}
cout << "\ndone. size -- " << this->count << " " << " max_size -- " << this->max_size << endl << endl;
} int main()
{
LRU lru;
vector<int> test = {, , , , , , , , , , , , , , , };
for (int i : test)
lru.insret(i);
return ;
}
结果:

LRU(最近最少使用淘汰算法)基本实现的更多相关文章
- Golang 随机淘汰算法缓存实现
缓存如果写满, 它必须淘汰旧值以容纳新值, 最近最少使用淘汰算法 (LRU) 是一个不错的选择, 因为你如果最近使用过某些值, 这些值更可能被保留. 你如果构造一个比缓存限制还长的循环, 当循环最后的 ...
- 缓存淘汰算法--LRU算法
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是"如果数据最近被访问过,那么将来被访问的几率也 ...
- 缓存淘汰算法---LRU
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...
- 【转】缓存淘汰算法系列之1——LRU类
原文地址:http://www.360doc.com/content/13/0805/15/13247663_304901967.shtml 参考地址(一系列关于缓存的,后面几篇也都在这里有):htt ...
- 04 | 链表(上):如何实现LRU缓存淘汰算法?
今天我们来聊聊“链表(Linked list)”这个数据结构.学习链表有什么用呢?为了回答这个问题,我们先来讨论一个经典的链表应用场景,那就是+LRU+缓存淘汰算法. 缓存是一种提高数据读取性能的技术 ...
- 缓存淘汰算法---LRU转
1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...
- LRU算法---缓存淘汰算法
计算机中的缓存大小是有限的,如果对所有数据都缓存,肯定是不现实的,所以需要有一种淘汰机制,用于将一些暂时没有用的数据给淘汰掉,以换入新鲜的数据进来,这样可以提高缓存的命中率,减少磁盘访问的次数. LR ...
- 淘汰算法 LRU、LFU和FIFO
含义: FIFO:First In First Out,先进先出LRU:Least Recently Used,最近最少使用 LFU:Least Frequently Used,最不经常使用 以上三者 ...
- 数据结构与算法之美 06 | 链表(上)-如何实现LRU缓存淘汰算法
常见的缓存淘汰策略: 先进先出 FIFO 最少使用LFU(Least Frequently Used) 最近最少使用 LRU(Least Recently Used) 链表定义: 链表也是线性表的一种 ...
随机推荐
- 4-3 组件参数校验与非props特性
本文参考脚本之家,https://www.jb51.net/article/143466.htm 通过属性的形式,父组件对子组件进行参数的传递 //如下图: //父组件设置content属性,向属性中 ...
- 剑指offer--2
前言:继续笔记分享! 面试题6:暂无好的解决方法先搁浅一下 面试题7: #include<stdio.h> #include<stdlib.h> typedef struct ...
- 手写spring(简易版)
本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作,如有错误之处忘不吝批评指正! 理解Spring本质: 相信之前在使用spring的时候大家都配置web.x ...
- Centos创建ftp服务器
整理的ftp服务的笔记: http://services.linuxpanda.tech/%E7%BD%91%E7%BB%9C%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/ ...
- 计算n的阶乘有多少个尾随零
思路一: 计算出n!= nValue,然后 nValue % 10 == 0 则nCount自增1,nValue /= 10 直到条件为否,最后nCount就是我们想要的结果,代码如下: int Co ...
- 第2章 细说Linux系统用户/组管理(1)
2.1 用户和组的基本概念 用户和组是操作系统中一种身份认证资源. 每个用户都有用户名.用户的唯一编号uid(user id).所属组及其默认的shell,可能还有密码.家目录.附属组.注释信息等. ...
- [PHP] php + phpstudy + phpstrom + xdebug + postman开启调试
主体 php + phpstudy + phpstrom + xdebug + postman + vue + chrome 使用的是前后端分离的开发方式,vue 在 webpack 通过代理进行请求 ...
- 结构型---享元模式(Flyweight Pattern)
引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非常严 ...
- SQL语句NOT IN优化之换用NOT EXISTS
NOT IN查询示例(示例背景描述:根据条件查询Questions表得到的数据基本在PostedData表中不存在,为完全保证查询结果在PostedData表中不存在,使用NOT IN): SET S ...
- Echarts图表legend的排版问题(转载)
来源:https://blog.csdn.net/david_jiahuan/article/details/80096922 案例一 项目中现有样式: 客户需求:将图例分为两列,并且上下两列的图例要 ...