这三种算法在实现的过程中的分析过程是这样的:
一、如果内存空间没满:
(1)加入的数据与现有的数据不相等怎么办
(2)加入的数据与现有的数据相等怎么办
二、如果内存已经占满:
(1)加入的数据与现有的数据不相等怎么办
(2)加入的数据与现有的数据相等怎么办
这四种情况中 二、(2)是最繁琐的一部分。
在这里也仅仅介绍这一部分的实现过程:
OPT算法:采用数组记录 t[30] 的方式,从当前位置向后遍历数据最远出现的数据的下标,然后进行替换。
LRU算法:其实思路与OPT算法的实现思路异曲同工,比LRU要简单,设置一个时间数组,对于数据进行时间记录,最终替换时间最久的数据。
FIFO算法:FIFO就非常巧妙了,在内存满,数据不相等时,利用预先设置好的flag数组进行记录替换次数,FIFO又称为先进先出,假设数据自顶向下存储,那么最顶端的就是最早出现的数据。每次都替换flag数值位置上的数据,当flag与存储空间相等时,再次将flag置0。
OPT 算法:
opt思想是:最久不使用的被替换,
package OPT;
import java.util.*;
public class OPT {
public static void sort(ArrayList p)
{
for(int i=0;i<p.size();i++)
System.out.print(p.get(i)+" ");
System.out.println("\n");
}
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
System.out.println("请输入数据数量:");
int n=input.nextInt();
System.out.println("页面大小固定为3");
int t=3;
ArrayList<ArrayList> OPT = new ArrayList<>();
ArrayList<Integer> page = new ArrayList<>();
int []a = new int [20];
System.out.println("请输入数据:");
for(int i=0;i<n;i++)
a[i] = input.nextInt();
page.add(a[0]);
ArrayList<Integer> pp=new ArrayList<>(page);
OPT.add(pp);
for(int i=1;i<n;i++)
{
if(page.size()<t)
{
boolean pos = page.contains(a[i]);
if(!pos)
{
page.add(page.size(),a[i]);
//sort(page);
ArrayList<Integer> p=new ArrayList<>(page);
OPT.add(p);
}
else
{
ArrayList<Integer> p=new ArrayList<>(page);
OPT.add(p);
//sort(page);
}
}
else
{
boolean pos = page.contains(a[i]);
if(pos)
{
ArrayList<Integer> p=new ArrayList<>(page);
OPT.add(p);
//sort(page);
}
else
{
int tt[] = new int [t];
for(int j=0;j<t;j++)
{
tt[j]=10000;
}
for(int k=0;k<t;k++)
{
int comp = page.get(k);
for(int j=i;j<n;j++)
{
if(comp==a[j])
if(j<tt[k]) tt[k]=j;
}
}
int MAX=tt[0],MAXi=0;
for(int j=1;j<t;j++)
if(MAX==tt[j]) {}
else if(MAX<tt[j]) {MAX=tt[j];MAXi=j;}
page.set(MAXi, a[i]);
//sort(page);
ArrayList<Integer> p=new ArrayList<>(page);
OPT.add(p);
}
}
}
//System.out.println(OPT.size());
for(int i=0;i<OPT.size();i++)
{
ArrayList cho = OPT.get(i);
if(cho.size()>=1)
{
System.out.print(cho.get(0)+" ");
}
else
System.out.println(" ");
}
System.out.println();
for(int i=0;i<OPT.size();i++)
{
ArrayList cho = OPT.get(i);
if(cho.size()>=2)
{
System.out.print(cho.get(1)+" ");
}
else
System.out.print(" ");
}
System.out.println();
for(int i=0;i<OPT.size();i++)
{
ArrayList cho = OPT.get(i);
if(cho.size()>=3)
{
System.out.print(cho.get(2)+" ");
}
else
System.out.print(" ");
}
}
}
LRU算法:
package LRU;
import java.util.*;
public class LRU {
public static void sort(ArrayList p,int time[])
{
for(int i=0;i<p.size();i++)
System.out.print(p.get(i)+" ");
System.out.println();
for(int i=0;i<time.length;i++)
System.out.print(time[i]+" ");
System.out.println("\n");
}
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
System.out.println("请输入数据数量:");
int n=input.nextInt();
System.out.println("页面大小固定为3");
int t=3;
ArrayList<ArrayList> LRU = new ArrayList<>();
ArrayList<Integer> page = new ArrayList<>();
int []a = new int [20];
int []time = new int [t];
for(int i=0;i<t;i++)
time[i]=0;
System.out.println("请输入数据:");
for(int i=0;i<n;i++)
a[i] = input.nextInt();
page.add(a[0]);
ArrayList<Integer> pp=new ArrayList<>(page);
LRU.add(pp);
for(int mar=0;mar<page.size();mar++)
time[mar]++;
sort(page,time);
for(int i=1;i<n;i++)
{
if(page.size()<t)//内存不满
{
boolean pos = page.contains(a[i]);//元素不等
if(!pos)
{
page.add(page.size(),a[i]);//首先加入page 中
for(int mar=0;mar<page.size();mar++)//再将时间累加
time[mar]++;
sort(page,time);
ArrayList<Integer> p=new ArrayList<>(page);
LRU.add(p);
}
else//元素相等
{
for(int mar=0;mar<page.size();mar++)//先将时间累加
time[mar]++;
int rep = page.indexOf(a[i]);//查找对应相等元素下标
time[rep] = 1; //时间置1
sort(page,time);
ArrayList<Integer> p=new ArrayList<>(page);
LRU.add(p);
//sort(page);
}
}
else//内存满
{
boolean pos = page.contains(a[i]);
if(pos)//元素相等
{
for(int mar=0;mar<t;mar++)//先将时间累加
time[mar]++;
int rep = page.indexOf(a[i]);//查找对应相等元素下标
time[rep] = 1; //时间置1
sort(page,time);
ArrayList<Integer> p=new ArrayList<>(page);
LRU.add(p);
}
else//元素不等
{
//查找时间最久元素
int MAX = time[0],MAXi = 0;
for(int j=1;j<t;j++)
if(MAX==time[j]) {}
else if(MAX<time[j]) {MAX = time[j]; MAXi = j;}
for(int mar=0;mar<t;mar++)//遍历累加时间
time[mar]++;
time[MAXi] = 1;//置改变位置时间为1
page.set(MAXi, a[i]);//替换元素
sort(page,time);
ArrayList<Integer> p=new ArrayList<>(page);
LRU.add(p);
}
}
}
for(int i=0;i<LRU.size();i++)
{
ArrayList cho = LRU.get(i);
if(cho.size()>=1)
{
System.out.print(cho.get(0)+" ");
}
else
System.out.println(" ");
}
System.out.println();
for(int i=0;i<LRU.size();i++)
{
ArrayList cho = LRU.get(i);
if(cho.size()>=2)
{
System.out.print(cho.get(1)+" ");
}
else
System.out.print(" ");
}
System.out.println();
for(int i=0;i<LRU.size();i++)
{
ArrayList cho = LRU.get(i);
if(cho.size()>=3)
{
System.out.print(cho.get(2)+" ");
}
else
System.out.print(" ");
}
}
}
FIFO算法:
package FIFO;
import java.util.ArrayList;
import java.util.Scanner;
public class FIFO {
public static void sort(ArrayList p,int time[])
{
for(int i=0;i<p.size();i++)
System.out.print(p.get(i)+" ");
System.out.println();
for(int i=0;i<time.length;i++)
System.out.print(time[i]+" ");
System.out.println("\n");
}
public static void main(String[] args) {
Scanner input =new Scanner(System.in);
System.out.println("请输入数据数量:");
int n=input.nextInt();
System.out.println("页面大小固定为3");
int t=3;
ArrayList<ArrayList> LRU = new ArrayList<>();
ArrayList<Integer> page = new ArrayList<>();
int []a = new int [20];
int []time = new int [t];
int flag = 0;
for(int i=0;i<t;i++)
time[i]=0;
System.out.println("请输入数据:");
for(int i=0;i<n;i++)
a[i] = input.nextInt();
page.add(a[0]);
ArrayList<Integer> pp=new ArrayList<>(page);
LRU.add(pp);
for(int mar=0;mar<page.size();mar++)
time[mar]++;
//sort(page,time);
for(int i=1;i<n;i++)
{
if(page.size()<t)//内存不满
{
boolean pos = page.contains(a[i]);//元素不等
if(!pos)
{
page.add(page.size(),a[i]);//首先加入page 中
//sort(page,time);
ArrayList<Integer> p=new ArrayList<>(page);
LRU.add(p);
}
else//元素相等
{
int rep = page.indexOf(a[i]);//查找对应相等元素下标
//sort(page,time);
ArrayList<Integer> p=new ArrayList<>(page);
LRU.add(p);
}
}
else//内存满
{
boolean pos = page.contains(a[i]);
if(pos)//元素相等
{
int rep = page.indexOf(a[i]);//查找对应相等元素下标
//sort(page,time);
ArrayList<Integer> p=new ArrayList<>(page);
LRU.add(p);
}
else//元素不等
{
page.set(flag, a[i]);//替换元素
flag++;
if(flag==t)
flag = 0;
//sort(page,time);
ArrayList<Integer> p=new ArrayList<>(page);
LRU.add(p);
}
}
}
for(int i=0;i<LRU.size();i++)
{
ArrayList cho = LRU.get(i);
if(cho.size()>=1)
{
System.out.print(cho.get(0)+" ");
}
else
System.out.println(" ");
}
System.out.println();
for(int i=0;i<LRU.size();i++)
{
ArrayList cho = LRU.get(i);
if(cho.size()>=2)
{
System.out.print(cho.get(1)+" ");
}
else
System.out.print(" ");
}
System.out.println();
for(int i=0;i<LRU.size();i++)
{
ArrayList cho = LRU.get(i);
if(cho.size()>=3)
{
System.out.print(cho.get(2)+" ");
}
else
System.out.print(" ");
}
}
}