当前位置:文档之家› 求属性集的闭包和求候选键的2个算法(JAVA实现)

求属性集的闭包和求候选键的2个算法(JAVA实现)

求属性集的闭包和求候选键的2个算法(JAVA实现)
求属性集的闭包和求候选键的2个算法(JAVA实现)

//本程序实现了《数据库原理》课程中的2个算法

//1 求属性集的闭包

//2 求候选键

//如执行java Closure

//则验证第一个算法,即教材4.1 求属性集的闭包

//如执行java Closure 2

//则验证第2个算法即可教材4.2 求候选键

import java.util.*;

class funsdepend{

ArrayList cols=new ArrayList(); //输入的属性列集合

HashMap funs=new HashMap(); //输入的函数依赖集合ArrayList keys=new ArrayList(); //求得的候选键集合

//输入属性列

void inputCols(){

cols.clear(); //清空旧数据

System.out.println("请输入单字母表示的属性列,一次可输入多列(如ABC),可多次输入,输入end则结束输入");

Scanner in=new Scanner(System.in);

while (in.hasNext()){

String str=in.nextLine();

if (str.toLowerCase().equals("end")) break;

for (int i=0; i

//依次取出每个字母

String s=str.substring(i,i+1).toUpperCase();

//不重复地添加到cols中

if (!cols.contains(s)) cols.add(s);

}

}

}

//输入函数依赖

void inputFuns(){

funs.clear();//清空旧数据

System.out.println("请输入形如AB-C的函数依赖,一次可输入多个(如A-B,B-C),输入end则结束输出");

Scanner in=new Scanner(System.in);

while (in.hasNext()){

String str=in.nextLine();

if (str.toLowerCase().equals("end")) break;

String[] fs=str.split(","); //约定用,分开连续输入的多个函数依赖

for (String fun:fs){

String[] s=fun.split("-");//预定用-分开单个依赖的左边、右边

if (s.length==2)

funs.put(s[0].toUpperCase(),s[1].toUpperCase());//将每个函数依赖以名值对的形式存入HashMap

}

}

}

//测试str1中的每个字符是否都包含在str2中

//例如isInclude("BE","ABCE")则返回true

boolean isInclude(String str1,String str2){

boolean flag=true;

for(int i=0;i

if ( str2.indexOf(str1.charAt(i))==-1 ) {

flag=false;

break;

}

}

return flag;

}

// 将small中的每个字符不重复地加入到big中

//例如addStr("BE","ABC")则返回ABCE

String addStr(String small,String big){

String str=big;

for(int i=0;i

if ( big.indexOf(small.charAt(i))==-1 ) {

str=str+small.substring(i, i+1);

}

}

return str;

}

//计算属性闭包

//参数col:待计算的属性列组合fs:以HashMap表示的函数依赖集

String getClosure(String col,HashMap fs){

String result=col.toUpperCase();

boolean bflag=true;

while (bflag){

bflag=false;

for(String s: fs.keySet()){

//依次取出每个函数依赖的左部

//如果左部包含在已求出的闭包中

if (isInclude(s,result)) {

//则将函数依赖的右部也放入闭包中

String str=addStr(fs.get(s),result);

if (!result.equals(str)) {

//如果放入右部后,闭包有变化,则更新闭包

result=str;

//并设置需要再次循环的标志

bflag=true;

}

}

}

}

return result;

}

//可多次重复测试算法4.1

void S41(){

System.out.println("请输入要计算属性闭包的列组合, 形如AB,输入end则结束"); Scanner in=new Scanner(System.in);

while (in.hasNext()){

String str=in.nextLine();

if (str.toLowerCase().equals("end")) break;

String s=getClosure(str,funs);

System.out.println(str+"属性集的闭包为:"+s);

System.out.println("");

System.out.println("请继续输入要计算属性闭包的列组合, 形如AB,输入end则结束"); }

}

//输出属性列和函数依赖

void outputCols_Funs(){

System.out.print("属性列为\t:");

System.out.println(cols);

System.out.print("F依赖集为\t:");

System.out.println(funs);

}

//测试算法4.1

void testS41(){

inputCols(); //输入属性列

inputFuns(); //输入函数依赖

outputCols_Funs();//输出属性列和函数依赖

S41();

}

//测试算法4.2 求候选键

void S42(){

String allleft="", allright="";

for(String s: funs.keySet()){

allleft=allleft+s; //所有函数依赖的左部

allright=allright+funs.get(s);//所有函数依赖的右部

}

// 依次代表L类,LR类, N类

String lefts="", leftrights="",nolfs="";

String allcol=""; //所有的列

for(String s: cols){

allcol=allcol+s;

if ((allleft.contains(s)) && (!allright.contains(s)))

lefts=lefts+s; //只在左部出现,没有在右部出现,归入lefts

else if ((allleft.contains(s)) && (allright.contains(s)))

leftrights=leftrights+s; //在左部、右部都出现,归入leftrights else if ((!allleft.contains(s)) && (!allright.contains(s)))

nolfs=nolfs+s; //在左部、右部都没有出现,归入nolfs }

System.out.println("L类是:"+lefts);

System.out.println("N类是:"+nolfs);

System.out.println("LR类是:"+leftrights);

keys.clear(); //keys 用于存放求出的多个候选键

String s=getClosure(lefts+nolfs,funs);

if (isInclude(allcol,s)){

//如果L/N类的闭包已含有全部属性列,则L/N类的组合是唯一候选键

System.out.println("唯一候选键是:"+lefts+nolfs);

keys.add(lefts+nolfs);

return;

}

char[] lrs=leftrights.toCharArray() ; //将LR列转为字符数组

for (int i=1; i<=lrs.length;i++){

List L=combine(lrs,i); //从LR类中取出长度为1,2,...n的属性列的字符数组,存放在L 中

for(Object chs:L){

// L 类+N类+排列组合出的LR类

String tstr=lefts+nolfs+String.copyValueOf((char[])chs);

s=getClosure(tstr,funs);

if (isInclude(allcol,s)){ // 如果求出的闭包含有全部属性列,则该组合可能是一个候选键

boolean flag=true;

for(String tmp:keys)

if (isInclude(tmp,tstr)) { //测试该组合是否包含了已求出的候选键,

flag=false; break; //如包含,则该组合不是候选键, 设置false标志}

if (flag) keys.add(tstr); //否则,将该组合加入到候选键中

}

}

}

System.out.println("候选键是"+keys);

}

//测试求候选键的算法4.2

void testS42(){

inputCols(); //输入属性列

inputFuns(); //输入函数依赖

outputCols_Funs();//输出属性列和函数依赖

S42();

}

//combine 是排列组合算法该算法来源于网络

//从n个字符中选择m个字符的组合算法

// 本程序的思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标// 代表的数被选中,为0则没选中。

// 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。

// 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为

// “01”组合,同时将其左边的所有“1”全部移动到数组的最左端。

// 当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得// 到了最后一个组合。

// 例如求5中选3的组合:

// 1 1 1 0 0 //1,2,3

// 1 1 0 1 0 //1,2,4

// 1 0 1 1 0 //1,3,4

// 0 1 1 1 0 //2,3,4

// 1 1 0 0 1 //1,2,5

// 1 0 1 0 1 //1,3,5

// 0 1 1 0 1 //2,3,5

// 1 0 0 1 1 //1,4,5

// 0 1 0 1 1 //2,4,5

// 0 0 1 1 1 //3,4,5

public List combine(char[] a,int m){

int n = a.length;

List result = new ArrayList();

char[] bs = new char[n];

for(char i=0;i

bs[i]=0;

}

//初始化

for(int i=0;i

bs[i]=1;

}

boolean flag = true;

boolean tempFlag = false;

int pos = 0;

int sum = 0;

//首先找到第一个10组合,然后变成01,同时将左边所有的1移动到数组的最左边

do{

sum = 0;

pos = 0;

tempFlag = true;

result.add(print(bs,a,m));

for(int i=0;i

if(bs[i]==1 && bs[i+1]==0 ){

bs[i]=0;

bs[i+1]=1;

pos = i;

break;

}

}

//将左边的1全部移动到数组的最左边

for(int i=0;i

if(bs[i]==1){

sum++;

}

}

for(int i=0;i

if(i

bs[i]=1;

}else{

bs[i]=0;

}

}

//检查是否所有的1都移动到了最右边

for(int i= n-m;i

if(bs[i]==0){

tempFlag = false;

break;

}

}

if(tempFlag==false){

flag = true;

}else{

flag = false;

}

}while(flag);

result.add(print(bs,a,m));

return result;

}

//取得某一个数字串实际对应的组合

//例如bs为101, 则取数组a的的第1,3元素private char[] print(char[] bs,char[] a,int m){ char[] result = new char[m];

int pos= 0;

for(int i=0;i

if(bs[i]==1){

result[pos]=a[i];

pos++;

}

}

return result ;

}

//输出排列组合的结果

private void print(List l){

System.out.println("个数:"+l.size());

for(int i=0;i

char[] a = (char[])l.get(i);

for(int j=0;j

System.out.print(a[j]+"\t");

}

System.out.println();

}

}

}

public class Closure {

public static void main(String[] args) {

funsdepend p=new funsdepend();

if ( (args.length==1) && args[0].equals("2"))

{ System.out.println("测试算法4.2 求候选键");

p.testS42();

}

else

{

System.out.println("测试算法4.1 求属性集的闭包");

p.testS41();

}

}

}

JAVA经典算法案例

JA V A经典算法40例 【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i<=20;i++) System.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 或 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=1;i<=20;i++) System.out.println(mymath.f(i)); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=2;i<=200;i++) if(mymath.iszhishu(i)==true) System.out.println(i); } } class math { public boolean iszhishu(int x) { for(int i=2;i<=x/2;i++) if (x % i==0 ) return false; return true; } } 【程序3】题目:打印出所有的"水仙花数",所谓"水仙花数 "是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水

javamath类常用方法

例如求平方根的(n),求a的b次方(a, b),求绝对值(n)等很多。下面是一些演示。publicclassMathTest { publicstaticvoidmain(String[]args) { intn=16; ? 3)); ? ? } } publicclassMathDemo{ publicstaticvoidmain(Stringargs[]){ /** *abs求绝对值 */ 的时候会取偶数 */ // // // // // // // // // // /** *round四舍五入,float时返回int值,double时返回long值 */ //10 //11 //11 //11 //-10 //-11 //-11 //-10 } }

函数(方法) 描述 IEEEremainder(double,double) 按照IEEE754标准的规定,对两个参数进行余数运算。 abs(inta) 返回int值的绝对值 abs(longa) 返回long值的绝对值 abs(floata) 返回float值的绝对值 abs(doublea) 返回double值的绝对值 acos(doublea) 返回角的反余弦,范围在到pi之间 asin(doublea) 返回角的反正弦,范围在-pi/2到pi/2之间 atan(doublea) 返回角的反正切,范围在-pi/2到pi/2之间 atan2(doublea,doubleb) 将矩形坐标(x,y)转换成极坐标(r,theta) ceil(doublea) 返回最小的(最接近负无穷大)double值,该值大于或等于参数,并且等于某个整数cos(double) 返回角的三角余弦 exp(doublea) 返回欧拉数e的double次幂的值 floor(doublea) 返回最大的(最接近正无穷大)double值,该值小于或等于参数,并且等于某个整数log(doublea) 返回(底数是e)double值的自然对数 max(inta,intb) 返回两个int值中较大的一个 max(longa,longb) 返回两个long值中较大的一个 max(floata,floatb) 返回两个float值中较大的一个 max(doublea,doubleb) 返回两个double值中较大的一个 min(inta,intb) 返回两个int值中较小的一个 min(longa,longb) 返回两个long值中较小的一个 min(floata,floatb)

银行家算法实验报告

操作系统 (实验报告) 银行家算法姓名:***** 学号:***** 专业班级:***** 学验日期:2011/11/22 指导老师:***

一、实验名称: 利用银行家算法避免死锁 二、实验内容: 需要利用到银行家算法,来模拟避免死锁:设计M个进程共享N类资源,M个进程可以动态的申请资源,并可以判断系统的安全性,进行打印出,相应的安全序列和分配表,以及最后可用的各资源的数量。 三、实验目的: 银行家算法是一种最有代表性的避免死锁的算法,在避免死锁的方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。 为实现银行家算法,系统必须设置若干数据结构,所以通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁,产生死锁的必要条件,安全状态等重要的概念,并掌握避免死锁的具体实施方法。 四、实验过程 1.基本思想: 我们可以把操作系统看成是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程申请到资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过再测试系统现资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。 安全状态就是如果存在一个由系统中所有进程构成的安全序列P1……则系统处于安全状态。安全状态是没有死锁发生。而不安全状态则是不存在这样一个安全序列,从而一定会导致死锁。 2.主要数据结构: (1)可利用资源向量Available.这是一个含有m个元素的数组,其中的每一个 元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类的资源的分配和回收而动态地改变,如果Available[j]=K,则表示系统中现有Rj类资源K个。 (2)最大需求矩阵Max.这是一个n*m的矩阵,定义了系统中n 个进程中的每 一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K. (3)分配矩阵Allocation.这也是一个n*m的矩阵,它定义了系统中每一类资源

用银行家算法实现资源分配

南通大学 杏林学院 操作系统实验(用银行家算法实现资源分配)班级:计121 小组成员:方筱雯1213023008 周徐莲1213023014 指导老师:丁卫平

一:实验目的 为了了解系统的资源分配情况,假定系统的任何一种资源在任一时刻只能被一个进程使用。任何资源已经占用的资源只能由自己释放,而不能由其他进程抢占。当进程申请的资源不能满足时,必须等待。因此,只要资源分配算法能保证进程的资源请求,且不出现循环等待,则系统不会出现死锁。 编写模拟系统进行资源调度的程序,采用银行家算法,有效的避免死锁的产生。模拟进程的分配算法,了解死锁的产生和避免的办法。二:实验要求 (1):为了观察死锁产生和避免的情况,要求设计3到4个并发进程,共享系统的10个同类不可抢占的资源。各进程是动态进行资源的申请和释放。 (2):用银行家算法设计一个资源分配程序,运行这个程序,观察系统运行情况,并对系统运行的每一步进行显示。三:实验流程图

四:源程序 #include #include #include #include #define MaxNumber 100 //定义进程控制块 struct Process_struct{ int Available[MaxNumber]; //可利用资源数组 int Max[MaxNumber][MaxNumber]; //最大需求矩陈 int Allocation[MaxNumber][MaxNumber]; //分配矩陈 int Need[MaxNumber][MaxNumber]; //需求矩陈 int Request[MaxNumber][MaxNumber]; //M个进程还需要N类资源的资源量 int Finish[MaxNumber]; int p[MaxNumber]; }Process; int M,N; //M个进程,N类资源 int i,j,k,l=0; int Work[MaxNumber]; //可利用资源 int Pinput(); int Safe(); int Peques(); //进程输入 int Pinput() { int i,j; cout<<"输入进程的数目:\n"; cin>>M; cout<<"输入资源的种类:\n"; cin>>N; cout<<"输入每个进程最多所需的各类资源数,按照"<>Process.Max[i][j]; cout<<"输入每个进程已经分配的各类资源数,按照"<

Java经典算法大全

Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... */ package https://www.doczj.com/doc/3214923440.html,.flywater.FiftyAlgorthm; public class FirstRabbit { public static final int MONTH = 15; public static vo id main(String[] args) { long f1 = 1L, f2 = 1L; long f; for(int i=3; i

JAVA中常用类的常用方法

JAVA中常用类的常用方法 一、类 1、clone()方法 创建并返回此对象的一个副本。要进行“ 克隆” 的对象所属的类必须实现. Cloneable接口。 2、equals(Object obj)方法 功能:比较引用类型数据的等价性。 等价标准:引用类型比较引用,基本类型比较值。 存在特例:对File、String、Date及封装类等类型来说,是比较类型及对象的内 容而不考虑引用的是否为同一实例。 3、finalize()方法 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 4、hashCode()方法 返回该对象的哈希码值。 5、notify()方法 唤醒在此对象监视器上等待的单个线程。 6、notifyAll()方法 唤醒在此对象监视器上等待的所有线程。 7、toString()方法 返回该对象的字符串表示。在进行String与其它类型数据的连接操作时,自动调用toString()方法。可以根据需要重写toString()方法。 8、wait()方法 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。 二、字符串相关类 String类 charAt(int index) 返回指定索引处的 char 值。 compareTo(String anotherString) 按字典顺序比较两个字符串。 compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 concat(String str) 将指定字符串连接到此字符串的结尾。 endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 equals(Object anObject) 将此字符串与指定的对象比较。 equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比 较,不考虑大小写。 indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 indexOf(String str) 返回第一次出现的指定子字符串在此字符串中的索引。 lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 length() 返回此字符串的长度。 replace(char oldChar, char newChar)

银行家算法

操作系统课程设计报告题目:银行家算法 院(系):计算机科学与工程学院 专业: 班级: 学生: 学号: 指导教师: 2011年12月

目录 摘要 (1) 绪论 (1) 1、需求分析 (1) 1.1银行家算法的提出 (1) 1.2 银行家算法设计思想 (1) 1.3银行家算法设计分析 (2) 2、概要设计 (3) 2.1主要的常量变量 (4) 2.2算法中用到的数据结构的说明 (8) 2. 3算法中用到的函数.......................................................................( 8) 2.4 银行家算法 (8) 2.5流程图.................................... . (9) 3、详细设计 (13) 4. 调试与测试 (8) 4.1测试数据 (8) 4.2.测试的结果: (9) 5、结论 (10) 参考文献 (10) 附录 (11)

摘要 在多道操作系统中,可以利用多个进程并发执行来改善系统资源利用率,提高系统的吞吐量,但也可能发生人们不想看到的危险——死锁。为了解决这个问题,人们引入了多种机制处理死锁问题。本文主要介绍了操作系统如何运用银行家算法和安全性算法避免死锁的产生。同时运用Java编程语言模拟计算机内部资源分配的过程。让读者对银行家算法有更深刻的认识。 关键字:死锁银行家算法安全性算法资源分配 1.需求分析. 1.1银行家算法的提出 本次课程设计主要解决的问题是死锁的避免。 死锁:是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程将永远不能再向前推进。 避免死锁是在不破坏死锁产生的四个必要条件,在资源的动态分配中,防止进程进入可能发生死锁的不安全状态。 根据此原理,Dijkstra 于1965年提出了一个经典的避免死锁的算法----银行家算法(banker’s algorithm)。 银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。所以通过编写一个模拟动态资源分配的银行家算法程序,进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念,并掌握避免死锁的具体实施方法. 1.2 银行家算法设计思.想 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。 为保证资金的安全,银行家规定: (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客; (2)顾客可以分歧贷款,但贷款的总数不能超过最大需求量; (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可

JAVA算法100例_全源码

JA V A经典算法40题 【程序1】题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子的规律为数列1,1,2,3,5,8,13,21.... public class exp2{ public static void main(String args[]){ int i=0; for(i=1;i<=20;i++) System.out.println(f(i)); } public static int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 或 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=1;i<=20;i++) System.out.println(mymath.f(i)); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } } 【程序2】题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class exp2{ public static void main(String args[]){ int i=0; math mymath = new math(); for(i=2;i<=200;i++) if(mymath.iszhishu(i)==true) System.out.println(i); } } class math { public int f(int x) { if(x==1 || x==2) return 1; else return f(x-1)+f(x-2); } public boolean iszhishu(int x) { for(int i=2;i<=x/2;i++) if (x % 2==0 ) return false; return true;

JAVA中常用类的常用方法

JAVA屮常用类的常用方法 一.java?丨ang.Object 类 1、clone()方法 创建丼返M此对象的一个副木。要进行“克隆”的对象所属的类必须实现https://www.doczj.com/doc/3214923440.html,ng. Cloneable 接口。 2、equals(Objectobj)方法 0 功能:比较引用类型数据的等价性。 0 等价标准.?引用类型比较引用,基木类型比较值。 0 存在特例.?对File、String、Date及封装类等类型来说,是比较类型及对象的内稃而+ 考虑引用的是否为同一实例。 3、finalize〇方法 当垃圾丨"丨收器确定>(、存在对该对象的更多引用时,由对象的垃圾丨"丨收器调用此方法。 4、hashCode〇方法返 回该对象的哈希码值。 5、notify〇方法 唤醒在此对象监视器上等待的中?个线祝。 6、notifyAII〇方法 唤醒在此对象监视器上等待的所有线程= 7、toString()方法 返W该对象的字符串表示。在进行String与其它类型数据的连接操作时,&动调用tostringo 方法。可以根据耑要重写toStringO方法。 8、wait()方法 在其他线程调用此对象的n〇tify()方法或notifyAIIO方法前,异致当前线程等待。 二、字符串相关类 I String 类 charAt(int index)返回指定索引处的char值。compareTo{String anotherString)按字

典顺序比较两个字符串。compareTolgnoreCase(Stringstr)按字典顺序比较两个字 符串,不考虑人小写。concat(String str)将指定字符串连接到此字符串的结尾。 endsWith(String suffix)测试此字符串是否以指定的〗?缀结束。equals{Object anObject)将此字符串与指定的对象比较。 equalslgnoreCase(String anotherString)将此String 与另一个String 比较,考虑人小'与’。indexOf(int ch)返H指定字符在此字符串屮第一次出现处的索引。 indexOf(String str)返回第一次出现的指定子字符串在此字符串屮的索引, lastlndexOf(intch)返回指定字符在此字符串中最后??次出现处的索引。 length()返|n丨此字符串的长度。 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar得到的。 split(String regex)根据给定正则表达式的匹配拆分此字符串。startsWith{String prefix)测试此字符 串是否以指定的前缀开始。substring(int beginlndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 substring(int beginlndex, int endlndex) 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginlndex 处开始,一直到索引endlndex-1处的字符。 t〇CharArray()将此字符串转换为一个新的字符数组。

银行家算法报告和代码

1
课程设计(论文)
题 目: 银行家算法 院 (系): 信息与控制工程系 专业班级: 姓 名: 学 号: 指导教师:
2016 年 1 月 15 日
页脚内容 16

1
西安建筑科技大学华清学院课程设计(论文)任务书
专业班级: 学生姓名:
指导教师(签名):
一、课程设计(论文)题目
银行家算法:设计一个 n 个并发进程共享 m 个系统资源的程序以实现银行家算法。
二、本次课程设计(论文)应达到的目的
操作系统课程实践性比较强。课程设计是加强学生实践能力的一个强有力手段。课程设计要求学 生在完成程序设计的同时能够写出比较规范的设计报告。严格实施课程设计这一环节,对于学生基本 程序设计素养的培养和软件工作者工作作风的训练,将起到显著的促进作用。
本题目要达到目的:了解多道程序系统中,多个进程并发执行的资源分配。掌握银行家算法,了 解资源在进程并发执行中的资源分配情况。掌握预防死锁的方法,系统安全状态的基本概念。
三、本次课程设计(论文)任务的主要内容和要求(包括原始数据、技术参 数、设计要求等)
要求: 1)能显示当前系统资源的占用和剩余情况。 2)为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功; 3)撤销作业,释放资源。 编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法, 有效地防止和避免死锁的发生。 银行家算法分配资源的原则是:系统掌握每个进程对资源的最大需求量,当进程要求申请资源时, 系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量 时,就满足进程的当前申请。这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后 归还它所占有的全部资源供其它进程使用。
四、应收集的资料及主要参考文献:
操作系统经典算法的编程实现资料非常丰富,可以在图书馆找书籍或在因特网上找资料,都很容 易找到,但是大部分代码是不全的,不能直接运行,希望大家只是把它当参考,编码还是自己做。
参考文献: 【1】汤小丹、梁红兵、哲凤屏、汤子瀛 编著.计算机操作系统(第三版).西安:西 安电子科技大学出版社,2007.5 【2】史美林编.计算机操作系统教程.北京:清华大学出版社,1999.11 【3】徐甲同编著.操作系统教程.西安:西安电子科技大学出版社,1996.8 【4】Clifford,A.Shaffer 编著.数决结构与算法分析(C++版).北京:电子工业出版 社,2005.7 【5】蒋立翔编著.C++程序设计技能百练.北京:中国铁道出版社,2004.1
五、审核批准意见
教研室主任(签字)
1 页脚内容

JAVA中常用类的常用方法

JAVA中常用类的常用方法 一、https://www.doczj.com/doc/3214923440.html,ng.Object类 1、clone()方法 创建并返回此对象的一个副本。要进行“克隆”的对象所属的类必须实现https://www.doczj.com/doc/3214923440.html,ng. Cloneable接口。 2、equals(Object obj)方法 ?功能:比较引用类型数据的等价性。 ?等价标准:引用类型比较引用,基本类型比较值。 ?存在特例:对、Date及封装类等类型来说,是比较类型及对象的内容而不考虑引用的是否为同一实例。 3、finalize()方法 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 4、hashCode()方法返回该对象的哈希码值。 5、notify()方法唤醒在此对象监视器上等待的单个线程。 6、notifyAll()方法唤醒在此对象监视器上等待的所有线程。 7、toString()方法 返回该对象的字符串表示。在进行String与其它类型数据的连接操作时,自动调用toString()方法。可以根据需要重写toString()方法。 8、wait()方法 在其他线程调用此对象的notify() 方法或notifyAll() 方法前,导致当前线程等待。 二、字符串相关类 l String类 charAt(int index) 返回指定索引处的char 值。 compareTo(String anotherString) 按字典顺序比较两个字符串。 compareToIgnoreCase(String str) 按字典顺序比较两个字符串,不考虑大小写。 concat(String str) 将指定字符串连接到此字符串的结尾。 endsWith(String suffix) 测试此字符串是否以指定的后缀结束。 equals(Object anObject) 将此字符串与指定的对象比较。 equalsIgnoreCase(String anotherString) 将此String 与另一个String 比较,不考虑大小写。indexOf(int ch) 返回指定字符在此字符串中第一次出现处的索引。 indexOf(String str) 返回第一次出现的指定子字符串在此字符串中的索引。 lastIndexOf(int ch) 返回指定字符在此字符串中最后一次出现处的索引。 length() 返回此字符串的长度。 replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用newChar 替换此字符串中出现的所有oldChar 得到的。split(String regex) 根据给定正则表达式的匹配拆分此字符串。 startsWith(String prefix) 测试此字符串是否以指定的前缀开始。 substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。该子字符串从指定的beginIndex 处开

银行家算法的java编程实现

/*死锁避免和死锁检测模拟程序【银行家算 法】网络工程06-3班学号:310609040308*/ import java.util.*; public class TestTheBanker { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); TheBanker tb = new TheBanker(); tb.deadlockAvoidance();//死锁避免 int gate = 1; while(gate!=0){ tb.deadlockDetection();//死锁检测 System.out.println("如果您要继续分配资源请输入\"1\",退出请输入\"0\""); System.out.print("您输入的值为:"); gate = scanner.nextInt(); System.out.println(); } System.out.println("使用愉快!期待您下次使用!"); } } class TheBanker{ int m; int n; int[][] max; int[][] maxbak;//备份用 int[][] allocation; int[][] allocationbak;//备份用 int[][] need; int[][] needbak;//备份用 int[] available; int[] availablebak;//备份用 public TheBanker(){ Scanner s = new Scanner(System.in); System.out.println("初始化=============="); System.out.print("请依次输入系统中的【进程数】和【资源类型数】:"); m = s.nextInt(); n = s.nextInt(); max =new int[m][n];

《银行家算法的模拟实现》—实验报告

《银行家算法的模拟实现》 --实验报告 题目: 银行家算法的模拟实现 专业: 班级: 组员: 指导老师:

一、实验目的 死锁会引起计算机工作僵死,因此操作系统中必须防止。本实验的目的在于让学生独立的使用高级语言编写和调试一个系统动态分配资源的简单模拟程序,了解死锁产生的条件和原因,并采用银行家算法有效地防止死锁的发生,以加深对课堂上所讲授的知识的理解。 二、实验内容 模拟实现银行家算法实现死锁避免。要求:初始数据(如系统在T0时刻的资源分配情况、每一种资源的总数量)从文本文件读入,文件中给出最大需求矩阵Max、分配矩阵Allocation,在程序中求得需求矩阵Need和可利用资源向量Available。 三、实验分析过程 1、整个银行家算法的思路。 先对用户提出的请求进行合法性检查,再进行预分配,利用安全性检查算法进行安全性检查。 1)进程一开始向系统提出最大需求量. 2)进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量. 3)若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的 剩余资源量,若不超出,则分配,否则等待 2、算法用到的主要数据结构和C语言说明。 (1)、可利用资源向量INT A V AILABLE[M] M为资源的类型。 (2)、最大需求矩阵INT MAX[N][M] N为进程的数量。 (3)、已分配矩阵INT ALLOCA TION[N][M] (4)、还需求矩阵INT NEED[N][N] (5)、申请各类资源数量int Request[x]; // (6)、工作向量int Work[x]; (7)、int Finish[y]; //表示系统是否有足够的资源分配给进程,0为否,非0为是 3、银行家算法(主程序) (1)、系统初始化。输入进程数量,资源种类,各进程已分配、还需求各资源数量,各资源可用数量等 (2)、输入用户的请求三元组(I,J,K),为进程I申请K个J类资源。 (3)、检查用户的请求是否小于还需求的数量,条件是K<=NEED[I,J]。如果条件不符则提示重新输入,即不允许索取大于需求量 (4)、检查用户的请求是否小于系统中的可利用资源数量,条件是K<=A V ALIABLE[I,J]。 如果条件不符则申请失败,阻塞该进程,重新进行进程动态资源申请(使用goto语句) (5)、进行资源的预分配,语句如下: A V ALIBLE[I][J]= A V ALIBLE[I][J]-K; ALLOCATION[I][J]= ALLOCATION[I][J]+K; NEED[I][J]=NEED[I][J]-K;

协同过滤推荐算法(java原生JDK实现-附源码地址)

协同过滤推荐算法(java原生JDK实现-附源 码地址) 一、项目需求 1.需求链接 https://https://www.doczj.com/doc/3214923440.html,/getStart/information.htm?raceId=231522 2.需求内容 训练数据包含了抽样出来的一定量用户在一个月时间(11.18~12.18)之内的移动端行为数据(D),评分数据是这些用户在这个一个月之后的一天(12.19)

对商品子集(P)的购买数据。参赛者要使用训练数据建立推荐模型,并输出用户在接下来一天对商品子集购买行为的预测结果。 评分数据格式 具体计算公式如下:参赛者完成用户对商品子集的购买预测之后,需要将结果放入指定格式的数据表(非分区表)中,要求结果表名为:tianchi_mobile_recommendation_predict.csv,且以utf-8格式编码;包含user_id 和item_id两列(均为string类型),要求去除重复。例如: 评估指标 比赛采用经典的精确度(precision)、召回率(recall)和F1值作为评估指标。具体计算公式如下: 其中PredictionSet为算法预测的购买数据集合,ReferenceSet为真实的答案购买数据集合。我们以F1值作为最终的唯一评测标准。 二、协同过滤推荐算法原理及实现流程 1.基于用户的协同过滤推荐算法 基于用户的协同过滤推荐算法通过寻找与目标用户具有相似评分的邻居用户,通过查找邻居用户喜欢的项目,推测目标用户也具有相同的喜好。基于用户的协同过滤推荐算法基本思想是:根据用户-项目评分矩阵查找当前用户的最近邻居,利用最近邻居的评分来预测当前用户对项目的预测值,将评分最高的N 个项目推荐给用户,其中的项目可理解为系统处理的商品。其算法流程图如下图1所示。

JavaMath类常用方法

例如求平方根的Math.sqrt(n),求a的b次方Math.pow(a, b),求绝对值Math.abs(n)等很多。下面是一些演示。 public class MathTest { public static void main(String[] args) { int n = 16; System.out.println(Math.sqrt(n)); System.out.println(Math.pow(2, 3)); System.out.println(Math.abs(-4)); System.out.println(Math.log10(100)); } } public class MathDemo { public static void main(String args[]){ /** * abs求绝对值 */ System.out.println(Math.abs(-10.4)); //10.4 System.out.println(Math.abs(10.1)); //10.1 /** * ceil天花板的意思,就是返回大的值,注意一些特殊值 */ System.out.println(Math.ceil(-10.1)); //-10.0 System.out.println(Math.ceil(10.7)); //11.0 System.out.println(Math.ceil(-0.7)); //-0.0 System.out.println(Math.ceil(0.0)); //0.0 System.out.println(Math.ceil(-0.0)); //-0.0 /** * floor地板的意思,就是返回小的值 */ System.out.println(Math.floor(-10.1)); //-11.0 System.out.println(Math.floor(10.7)); //10.0 System.out.println(Math.floor(-0.7)); //-1.0

基于java的实验——银行家算法

仲恺农业工程学院实验报告纸 东哥 实验三银行家算法 一.实验目的: 1、理解死锁概念,以及死锁产生的必要条件。 2、理解银行家算法基本原理。 3、掌握一种资源和多种资源的银行家算法的设计与实现。 二.实验内容: 1、设计出管理的资源种类和数量 2、设计出银行家算法的基本数据结构 3、设计出完成该资源的银行家算法 4、设计出简单的进程创建、运行资源需求、结束的过程 5、采用高级语言实现该应用程序 三.实验步骤和过程 1.死锁基本概念 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。 2. 产生死锁的原因 (1.竞争资源引起进程死锁 当系统中供多个进程共享的资源如打印机、公用队列的等,其数目不

足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁。 (2.进程推进顺序不当引起死锁 由于进程在运行中具有异步性特征,这可能使P1和P2两个进程按下述两种顺序向前推进。 (3. P或V操作不当、同类资源分配不均或对某些资源的使用未加限制等等。 3. 产生死锁的必要条件 1)互斥条件:指进程对所分配到的资源进行排它性使用,即在一段时间内某资源只由一个进程占用。如果此时还有其它进程请求资源,则请求者只能等待,直至占有资源的进程用毕释放。系统中存在临界资源,进程应互斥地使用这些进程。 2)占有和等待条件:指进程已经保持至少一个资源,但又提出了新的资源请求,而该资源已被其它进程占有,此时请求进程阻塞,但又对自己已获得的其它资源保持不放。 3)不剥夺条件:指进程已获得的资源,在未使用完之前,不能被剥夺,只能在使用完时由自己释放。 4)循环等待条件:指在发生死锁时,必然存在一个进程——资源的环形链,即进程集合{P0,P1,P2,···,Pn}中的P0正在等待一个P1占用的资源;P1正在等待P2占用的资源,……,Pn正在等待已被P0占用的资源。造成这组进程处于永远的等待状态! 4、处理死锁的基本方法 1) 预防死锁。 这是一种较简单和直观的事先预防的方法。方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。预防死锁是一种较易实现的方法,已被广泛使用。但是由于所施加的限制条件往往太严格,可能会导致系统资源利用率和系统吞吐量降低。

操作系统课程设计(银行家算法的模拟实现)

操作系统课程设计 (银行家算法的模拟实现) 一、设计目的 1、进一步了解进程的并发执行。 2、加强对进程死锁的理解。 3、用银行家算法完成死锁检测。 二、设计内容 给出进程需求矩阵C、资源向量R以及一个进程的申请序列。使用进程启动拒绝和资源分配拒绝(银行家算法)模拟该进程组的执行情况。 三、设计要求 1、初始状态没有进程启动。 2、计算每次进程申请是否分配,如:计算出预分配后的状态情况(安全状态、不安全状态),如果是安全状态,输出安全序列。 3、每次进程申请被允许后,输出资源分配矩阵A和可用资源向量V。 4、每次申请情况应可单步查看,如:输入一个空格,继续下个申请。 四、算法原理 1、银行家算法中的数据结构

(1)、可利用资源向量Available,这是一个含有m个元素的数组,其中的每个元素代表一类可利用资源的数目,其初始值是系统中所配置的该类全部资源的数目,其数值随该类资源的分配和回收而动态改变。如果Available[j]=K,则表示系统中现有Rj类资源K个。 (2)、最大需求矩阵Max,这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果 Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。 (3)、分配矩阵Allocation。这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已经分得Rj类资源的数目为K。 (4)、需求矩阵Need。这也是一个n*m的矩阵,用以表示每个进程尚需要的各类资源数。如果Need[i,j]=K,则表示进程i还需要 Rj类资源K个,方能完成其任务。上述三个矩阵间存在以下关系:Need[i,j]=Max[i,j]-Allocation[i,j] 2、银行家算法应用 模拟实现Dijkstra的银行家算法以避免死锁的出现,分两部分组成:一是银行家算法(扫描);二是安全性算法。 (1)银行家算法(扫描) 设Requesti是进程Pi的请求向量,如果Requesti[j]=K,表示进程Pi需要K个Ri类型的资源。当Pi发出资源请求后,系统按下述步骤进行检查: ①如果Requesti[j]<=Need[i,j],便转向步骤②;否则认为出错,

相关主题
文本预览
相关文档 最新文档