问题描述
给定参数p和n,p表示空间大小,n表示要加载到p个空间中的总的页面数,且p<n成立,求在FIFO和LRU的策略下,比较切换页面的次数,如果LRU切换次数少,则输出yes,反之输出no。之前使用链表存储,花了很多时间,跳出一种问题的坑,又陷入另一种问题,之后采用了数组存储。对于FIFO来说,设置一个变量temp,每次新存入一个数时,temp加一,并把这个数字赋值给存在p存储空间的单元,如果页面相同,那么数字不用加。因为初始值为-1,在空间需要覆盖时,count加一。num值越小说明它进来的越早。而对于LRU,不同点在于,新读入的数据和存储空间中的相同时,temp也需要加,并给空间的num赋予新值,表示它是最近用过的。
程序时间复杂度高,有时间再想想其他的实现。
代码
#include<iostream>
using namespace std;
struct Node
{
int data;
int num;
};
int fifo(int p, int n, Node *arrp, int *arrn)
{
int flag = 0;
int count = 0;
int temp = 0;
for(int i = 0; i < n; i++)
{
flag = 0;
int j = 0;
for(j = 0; j < p; j++)
{
if(arrp[j].data == arrn[i])
{
flag = 1;
break;
}
}
if(flag == 0 && j == p)
{
int minnum = arrp[0].num;
int mark = 0;
for(int k = 0; k < p; k++)
{
if(arrp[k].num < minnum)
{
minnum = arrp[k].num;
mark = k;
}
}
temp++;
if(arrp[mark].data != -1)
count++;
arrp[mark].data = arrn[i];
arrp[mark].num = temp;
}
}
return count;
}
int lru(int p, int n, Node *arrp, int *arrn)
{
int flag = 0;
int count = 0;
int temp = 0;
for(int i = 0; i < n; i++)
{
flag = 0;
int j = 0;
for(j = 0; j < p; j++)
{
if(arrp[j].data == arrn[i])
{
flag = 1;
temp++;
arrp[j].num = temp;
break;
}
}
if(flag == 0 && j == p)
{
int minnum = arrp[0].num;
int mark = 0;
for(int k = 0; k < p; k++)
{
if(arrp[k].num < minnum)
{
minnum = arrp[k].num;
mark = k;
}
}
temp++;
if(arrp[mark].data != -1)
count++;
arrp[mark].data = arrn[i];
arrp[mark].num = temp;
}
}
return count;
}
int main()
{
int p = 0, n = 0, temp1, temp2;
cin>>p>>n;
int *arrn = (int*)malloc(sizeof(int)*n);
Node *arrp = (Node*)malloc(sizeof(struct Node)*p);
for(int i = 0; i < n; i++)
cin>>arrn[i];
for(int j = 0; j < p; j++)
{
arrp[j].data = -1;
arrp[j].num = 0;
}
temp1 = fifo(p,n,arrp,arrn);
for(int k = 0; k < p; k++)
{
arrp[k].data = -1;
arrp[k].num = 0;
}
temp2 = lru(p,n,arrp, arrn);
if(temp1 > temp2)
cout<<"yes"<<" "<<temp1<<" "<<temp2;
else
cout<<"no"<<" "<<temp1<<" "<<temp2;
}