当前位置:文档之家› LRU算法的顺序栈实现

LRU算法的顺序栈实现

LRU算法的顺序栈实现
一、需求分析
1、本演示程序是对页面置换算法中的最近最久未使用的置换算法(LRU)的顺序栈的实现,并计算缺页率。

2、演示程序以用户和计算机对话的方式执行,即在计算机终端上显示“提示信息”下,用户可输入模拟缓存的大小(即cache值),并输入由文件的模拟页面流,最终进行计算缺页率。

3、最后对结果做出简单分析,包括对各组数据得出的结果的简单分析和对算法的进一步改进给予解释。

二、概要设计
1、本程序中顺序栈的抽象数据类型定义:
ADT Stack{
数据对象:D={a[i]|a[i]∈ElemSet,i=1,2,3,..,n,n>0}
数据关系: R1={<a[i-1],a[i]>|a[i-1],a[i]∈D,i=1,2..n }
约定a[n]端为栈顶,a[1]端为栈底
基本操作:
InitStack(&s)
操作结果:构造一个空栈
Push(&s,e)
初始条件:栈s已存在
操作结果:将元素e压入栈顶
Pop(&s,p)
初始条件:栈s已存在
操作结果:将栈s中指针p所指向的元素删去,(注:p不一定指向栈底)
}ADT Stack
2、本程序包括以下几个模块
Ⅰ、栈的操作模块,包括
InitStack(&s) //初始化栈操作
Push(&s,e) //元素压入栈顶操作
Pop(&s,p) //删除栈中元素操作
Ⅱ、主程序模块
void main()
{
初始化
While(页号未结束)
{
For循环查找是否在栈内
If处理页号不在栈内的情况
{
If来解决在栈未满的情况
Else if 来解决栈已满的情况
}
}
输出缺页率
}
三、详细设计
根据LRU算法的特点,进行栈的顺序实现,并在实现在c源文件中/*------------------------------基本操作的函数原型-----------------------------*/ #define STACK_INIT_SIZE 100 //栈的初始化大小
typedef int ElemType;
typedef struct{ //顺序栈的结构定义
ElemType *base;
ElemType *top;
int stacksize; //栈的大小
}SqStack;
InitStack(SqStack *s) //初始化栈
{
s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
//if(!s->base) exit(0);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
Push(SqStack *s,ElemType e) //元素压入栈顶
{
//本算法忽略栈满追加栈元素的情况,因为不会发生
*(s->top)=e;
s->top++;
}
Pop(SqStack *s,int *p) //删除栈中某个元素,并一定为栈底
{
while(p<s->top)
{
*p=*(p++);
p++;
}
s->top--;
}
四、用户手册

五、测试结果
新建文本文件barry.txt,内存放页号的流文件,是基于随机的页号数,如图所示:
而当cache为12时,运行结果如下:缺页率为0.373
而当cache为24时,运行结果如下:缺页率为0.255
六、算法分析及改进
首先本算法的删除操作和传统的顺序栈的删除操作不一样,这里的删除不一定只是删除栈底的元素,可以是栈中的任意一个元素,所以对于顺序的存储数据会存在删除时教复杂的问题。

也就是说本算法是基于顺序栈的数据结构实现的,所以会存在在删除栈中元素时会有时间复杂度较高的问题,由于本算法是有大量的删除和添加操作,所以还是用链式的栈实现在时间复杂度方面会更加的小一点,这也是本算法的一个可以改进的地方和不足。

从实验的结果可以看到,文件的缺页率比较高,可能的影响因素是该缓存cache的大小,当cache过小时,缺页率会变的很高,如调试运行结果中当cache 为12时,缺页率为0.373;而当cache为24时,缺页率为0.255。

还有一个原因就是该页号并非真实的模拟情况,只是一些随机产生的模拟数,与实际调用的页号有很大的差异性,这也是导致缺页率过高的另一个原因。

附:顺序栈实现的代码
#include <stdio.h>
#include <malloc.h>
#define STACK_INIT_SIZE 100 //初始化的栈最大值
typedef int ElemType;
typedef struct{ //栈的定义
ElemType *base;
ElemType *top;
int stacksize;
}SqStack;
InitStack(SqStack *s) //初始化栈
{
s->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));
//if(!s->base) exit(0);
s->top=s->base;
s->stacksize=STACK_INIT_SIZE;
}
Push(SqStack *s,ElemType e) //元素e压入栈顶,这里不存在栈元素满溢出的情况
{
*(s->top)=e;
s->top++;
}
Pop(SqStack *s,int *p) //删除栈中元素,这里不仅仅只是栈底元素{
while(p<s->top)
{
*p=*(p++);
p++;
}
s->top--;
}
void main()
{
SqStack s;
int cache,i=0,*p,sum=0,part=0;
FILE *fp;
int ch;
char filename[20];
printf("请输入文件名:\n");
scanf("%s",filename);
fp=fopen(filename,"r");
ch=fgetc(fp);
InitStack(&s);
printf("请输入cache的值:\n");
scanf("%d",&cache);
while(ch!=EOF)
{
for(p=s.base;p<s.top;p++) //查询栈中元素
{
if(*p==(ch-48)) //找到了,将元素放置到栈顶
{
Pop(&s,p);
Push(&s,(ch-48));
break;
}
}
if(p==s.top) //没找到
{
if((s.top-s.base)<cache) //栈未满,元素压入栈顶
{
Push(&s,(ch-48));
}
else if((s.top-s.base)==cache) //栈已满,删除栈底元素,将新元素压入栈顶
{
Pop(&s,s.base);
Push(&s,(ch-48));
}
part++;
}
i++;
sum++;
ch=fgetc(fp);
}
printf("part和sum分别为%d,%d\n",part,sum); //计算缺页率
printf("缺页率约为%.3f\n",(float)part/(float)sum);
}。

相关主题