1. 程式人生 > >最佳淘汰演算法(OPT) 先進先出的演算法(FIFO) 最近最久未使用演算法(LRU)

最佳淘汰演算法(OPT) 先進先出的演算法(FIFO) 最近最久未使用演算法(LRU)

#include<bits/stdc++.h>
#define Del(a,b) memset(a,b,sizeof(a))
using namespace std;
int a[4000];  //隨機生成的頁 
int c;//使用者頁面容量 
void init() //生成頁 
{
	srand(time(0));
	for(int i=1;i<=320;i++)
	{
		int q=rand()%317;
		//a[i++]=q/10;
		a[i++]=(q+1)/10;
		int head=rand()%(q+2);
		//a[i++]=head/10;
		a[i++]=(head+1)/10;
		int tail=(rand()%(318-q))+q+3;
		a[i]=tail/10;
		//a[i]=(tail+1)/10;
	}
	c=(rand()%29)+4;
}
struct node
{
	int dis,val,pos;  //距離下一個相同元素的距離,元素,位置 
	node(){}
	node(int dd,int vv,int pp)
	{
		dis=dd;val=vv;pos=pp;
	}
	bool operator < (const node & a) const  //優先佇列 
	{
		if(a.dis!=dis) return a.dis>dis;
		else return a.val>val;
	}
};
void OPT() //最佳淘汰法 (優先佇列實現) 
{
	
	int poss[400];
	int lack=0;
	int head[400],net[400];  //領接表儲存最近距離 
	Del(head,-1);
	Del(poss,0);
	
	priority_queue<node> q;
	for(int i=1;i<=320;i++)
	{
		net[i]=head[a[i]];
		head[a[i]]=i;
	}
	int t=1,tt=1;
	for(int i=1;i<=320;i++) //優先填滿  c頁
	{
		if(!poss[a[i]])
		{
			poss[a[i]]=t;
			t++;
		}
		q.push(node(net[i],a[i],poss[a[i]]));
		tt=i;
		if(t>c)
		break;
	}
	if(t<=c) 
	{
		printf("100%% 命中率\n");
		return; 
	} 
	for(int i=tt+1;i<=320;i++)
	{
		if(!poss[a[i]])
		{
			lack++;
			node p=q.top();
			q.pop();
			poss[a[i]]=p.pos;
			poss[p.val]=0;
		}
		q.push(node(net[i],a[i],poss[a[i]]));
	}
	printf("缺頁數 %d\n",lack);
	printf("%lf%%命中率\n",(1.0-((1.0*lack)/(1.0*320)))*100.0); 
}
void FIFO()
{
	int aim[400];
	int vis[400];
	Del(vis,0);
	int lack=0;
	int t=0,tt=0;
	queue<int>q;
	for(int i=1;i<=320;i++)
	{
		if(!vis[a[i]])
		{
			vis[a[i]]=1;
			t++;
			q.push(a[i]);
		}
		tt=i;
		if(t>c)
		break;
	}
	if(t<=c)
	{
		printf("100%% 命中率\n");
		return;
	}
	for(int i=tt+1;i<320;i++)
	{
		if(!vis[a[i]])
		{
			vis[a[i]]=1;
			vis[q.front()]=0;
			q.pop();
			lack++;
			q.push(a[i]);
		}
	}
	printf("缺頁數 %d\n",lack);
	printf("%lf%%命中率\n",(1.0-((1.0*lack)/(1.0*320)))*100.0);
}
void LRU()
{
	int time[400]={0};
	int vis[400]={0};
	int lack=0;
	int t=0,tt=0;
	queue<int>q;
	for(int i=1;i<=320;i++)
	{
		if(!vis[a[i]])
		{
			vis[a[i]]=1;
			t++;	
		}
		q.push(a[i]);
		time[a[i]]++;
		tt=i;
		if(t>c)
		break;
	}
	if(t<=c)
	{
		printf("100%% 命中率\n");
		return;
	}
	for(int i=tt+1;i<320;i++)
	{
		if(!vis[a[i]])
		{
			while(time[q.front()])
			{
				time[q.front()]--;
				if(time[q.front()]==0)
				break;
				q.pop();
			}
			vis[q.front()]=0;
			q.pop();
			vis[a[i]]=1;
			time[a[i]]++;
			q.push(a[i]);
			lack++;
		}
		q.push(a[i]);
		time[a[i]]++;
	}
	printf("缺頁數 %d\n",lack); 
	printf("%lf%%命中率\n",(1.0-((1.0*lack)/(1.0*320)))*100.0);
}
int main()
{
	//printf("!!\n");
	init();
	printf("OPT:\n");
	OPT();  //優先佇列 
	printf("FIFO:\n");
	FIFO(); //佇列 
	printf("LRU:\n");
	LRU();  //佇列 
}