📄 银行家算法改进版.txt
字号:
银行家算法改进版
/*程序中有几点值得注意的地方:
1、数据initial应该放在checkData()方法中,程序每次调用该方法是应该初始化数据,
由于时间紧张所以没有写读数据的方法
2、程序只根据老师给的例子来写,不能灵活的适应资源种类数不同、进程数不同的情况
3、如果要对程序进行改写应该把注意力放在下面几点上:
⑴:增加一个函数用来求出没有重复数字的序列,参数只能是一个进程个数的整数,配合only()方法使用;
⑵:only()方法应该只传递一个整数序列,由程序自动分离数据并判断
⑶:该算法中可以用线程模拟进程的运行情况来获取资源,使该算法具有更大的适应性
10.27:
通过这两天的改进,对筛选所有进程排序的组合可以采用“全排列算法”,使程序可一通过pMax.length()
获得进程数,然后把进程数传递进方法内就能得到所要的所有进程排列组合,然后再把这些组合一一的传递进
另一个方法中,用与判断其安全性。
10.28 全排列算法已改进到程序中
*/
public class Banker{
Banker()
{
initArray();
array(proSeq,0,pMax.length);
if(sum>0)System.out.println("There are "+sum+" legality!");
}
public static int sum=0;
private int[][] pMax={
{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}
};
int pr.length;//获取进程数
int[] proSeq=new int[pMax.length];
void initArray()
{
for(int i=0;i<pMax.length;i++) proSeq[ i ]=i;
}
public static boolean checkData(int[] procs)
{
//initial data
int[][] pAllocation={
{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}
};
int[][] pNeed={
{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}
};
int[] Available={3,3,2};
int[] ps;
ps=procs;
int i;
for(i=0;i<5;i++)
{
if(Available[0]<pNeed[ps[ i ]][0]) return false;
else if(Available[1]<pNeed[ps[ i ]][1]) return false;
else if(Available[2]<pNeed[ps[ i ]][2]) return false;
else{
Available[0]=Available[0]+pAllocation[ps[ i ]][0];
Available[1]=Available[1]+pAllocation[ps[ i ]][1];
Available[2]=Available[2]+pAllocation[ps[ i ]][2];
}
}
return true;
}
public static void array(int arr[],int count,int max)//cout表示第几位数排列完成max表示有几个数参与排列
{
int a[]=arr;
boolean put;
if(count==max-1) //若数组中全部排完时
{
put=checkData(a);
if(put){
sum++;
System.out.println("p"+a[0]+",p"+a[1]+",p"
+a[2]+",p"+a[3]+",p"+a[4]+" is legality!");
}
}else{
int b[]=new int[max]; //创建新数组,用于递归
for(int i=0;i<count;i++) b[ i ]=a[ i ];
int k=count;
for(int i=count;i<max;i++)
{
b[k++]=a[ i ];
for(int j=count;j<max;j++)
{
if(i!=j) b[k++]=a[j];
}
k=count;
array(b,count+1,max);
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Banker bankObj=new Banker();
}
}
来源:http://blog.csai.cn/user1/27650/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -