LRU和FIFO

来源:互联网 发布:mac英英词典 编辑:程序博客网 时间:2024/06/06 02:01

问题描述

给定参数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;}
原创粉丝点击