《操作系统》页面淘汰——LRU最久未使用算法c++实现
前言:
我只是通过网课用例和老师的用例,正确性不能保证hh(非常害怕误导大家
就算错了也许也能给大家提供思路~
算法描述
- 收到一个页面,cache里面有没有?
- 有就不用管
- 没有
- cache有没有满?
- 没满,将该页面加入cache
- 满了,看看cache里哪个页面好久没用了,把它替换即可
- cache有没有满?
- q数组存输入的页面序列,cache数组存内存里的页,**times存某个页距离上次被用到,已经几次没用到了*。如:times[65]=2表示A距离上次被用到,已经有两次没有用到了(A的ascii是65
- 得到cache里面每个页的闲置次数之后,通过比较大小,把最久没用的页替换即可(即最大的次数被替换
- 将cin换成scanf会错,因为会把换行符什么的读入,建议不要用字符读入数据
输入用例描述
网课输入用例
3
12
A B C D A B E A B C D E
实验给的用例
3
20
7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
4
12
4 3 2 1 4 3 5 4 3 2 1 5
5
11
4 7 0 7 1 0 1 2 1 2 6
实现代码
#include<iostream>
using namespace std;
const int N = 100;
char q[N];
char cache[N];
int times[N];
int hh = -1;//记录cache里面的页数
int main()
{
printf("软件202 唐熙\n");
int size, n, num = 0;//size表示cache大小,n表示输入页数,num表示中断次数
cin >> size >> n;
for (int i = 0; i < n; i++)
cin >> q[i];
for (int i = 0; i < n; i++)
{
cout << "当前cache数组:";
for (int i = 0; i < size; i++)
cout << cache[i] << " ";
cout << endl;
int pause = 1, j;
for (j = 0; j < size; j++)//看看cache里面有没有当前页面,有的话不用管
if (q[i] == cache[j])
pause = 0;
if (pause)//没有的话
{
num++;
if (hh < size - 1)//如果cache没有满的话
cache[++hh] = q[i];
else
{
int index = 0, max = times[cache[0]];
for (int k = 0; k <= hh; k++)//找到闲置次数最多的页
{
if (times[cache[k]] > max)
{
index = k;
max = times[cache[k]];
}
}
times[cache[index]] = 0;
cache[index] = q[i];
}
}
for (int i = 0; i <= hh; i++)
times[cache[i]]++;
times[q[i]] = 0;
}
cout << "当前cache数组:";
for (int i = 0; i < size; i++)
cout << cache[i] << " ";
cout << endl;
cout << "缺页次数:" << num << " 缺页率:" << double(num) / n;
return 0;
}
网课运行结果
实验用例运行结果
有帮助的话可以点个赞,我会很开心的~
分类:
一些算法实现
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?