《操作系统》页面淘汰——OPT最佳淘汰算法c++实现

前言:
我只是通过网课用例和老师的用例,正确性不能保证hh(非常害怕误导大家
就算错了也许也能给大家提供思路~
代码遍历后面序列时,可以改进一下,但是我懒~

算法描述

  • 收到一个页面,cache里面有没有?
    • 有就不用管
    • 没有
      • cache有没有满?
        • 没满,将该页面加入cache
        • 满了,看看cache里哪个页面在后面待访问的页面中,最晚出现,把它替换即可
  • q数组存输入的页面序列,cache数组存内存里的页,finded存某个页第一次出现在后面的下标。如:finded[65]=x表示,A在,未收到的页面序列中,第一次出现的下标是x(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 hh = -1;//记录cache存了几个数据
int finded[N];//记录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//cache早满了,那就找到cache里最后出现的页面,再换掉它
			{
				//初始化fined数组
				memset(finded, 0x3f, sizeof(finded));
				for (int k = i + 1; k < n; k++)//遍历后面的页面
				{
					for (int index = 0; index < size; index++)//对于每一个页面,查找是否在cache出现过
					{
						if (q[k] == cache[index] && finded[q[k]] > k)//如果这个页面是cache里的,保存一下它第一次出现的位置
						{
							finded[q[k]] = k;
							break;
						}
					}
				}
				int index = 0;//index存cache里哪个下标要被替换
				int max = finded[cache[0]];
				for (int k = 0; k < size; k++)//看看哪一个最晚出现
				{
					if (finded[cache[k]] > max)
					{
						max = finded[cache[k]];
						index = k;
					}
				}
				cache[index] = q[i];
			}
		}
	}
	cout << "当前cache数组:";
	for (int i = 0; i < size; i++)
		cout << cache[i] << " ";
	cout << endl;

	cout << "缺页次数:" << num << " 缺页率:" << double(num) / n;
	return 0;
}

网课用例运行结果(最后两行输出有点不一样,但我觉得换B或C无所谓

实验用例运行结果


posted @   穿过雾的阴霾  阅读(557)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示