求属性集的闭包和函数依赖的闭包算法(一)

前端之家收集整理的这篇文章主要介绍了求属性集的闭包和函数依赖的闭包算法(一)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近做数据库实验作业,要求写一个程序,程序语言不限,求出属性集的闭包和函数依赖的闭包。
题目要求如下:

1)根据求属性集闭包的算法,用你熟悉的语言编写程序,要求如下:


根据求属性集闭包的算法,用你熟悉的语言编写程序,要求如下:

1.由用户输入函数依赖,当用户输入End时,表示所有依赖都输入完毕。(函数依赖是由用户自己定的,程序中不能假定某个具体的依赖)

2.函数依赖的形式是AB->C,A->BE这样的形式,为了简单起见,我们假定所有的属性都是用英文的大写字母表示,由AZ。(提示,你可以让用户先输入依赖左边的属性,然后再输入依赖右边的属性,用来表示A->B这样的形式)

3.用户输入完毕所有的依赖后,显示“请输入属性集求闭包”的提示,当用户输入1个或者多个属性时,求出对应的闭包。(如,用户输入A,则显示A+的值,用户输入AB则求出AB+的值。显示完毕后,再次显示“请输入属性集求闭包”,让用户继续输入属性,直到用户输入END后程序结束。


2)在上面求属性集闭包的算法的基础上,根据求函数依赖闭包的算法,显示用户输入的函数依赖的闭包F+


以下是我用JAVA编写的程序(如果有所错误的话还望指出!)


import java.util.*; public class Closures { public void printout(Map map) { Set set=map.keySet();//获取Map集合中的key对象集合 Iterator it=set.iterator();//创建遍历器 System.out.println("保存的依赖为:"); while(it.hasNext()){ String str=(String)it.next(); String name=(String)map.get(str);//遍历Map集合 System.out.println(str+"->"+name); } } public String add(String name,String result) { String str=result; for(int i=0;i<name.length();i++) { if(result.indexOf(name.charAt(i))==-1) { str=str+name.substring(i,i+1); } } return str; } public String calculate(String result,Map map){ boolean flag=true; String comp;//比较是否增加了闭包 Set set=map.keySet(); Iterator it=set.iterator(); while(it.hasNext()) { flag=true; String str=(String)it.next(); String name=(String)map.get(str); int i=0; for(i=0;i<str.length();i++)//判断str是否在result中 { if(result.indexOf(str.charAt(i))==-1) { flag=false; break; } } if(flag==true)//如果在的话就把对应的右边的值五重复的加入result { comp=result; result=add(name,result); if(result!=comp){ result=calculate(result,map);//运用了递归,如果有所改变的话就递归的再次重新扫一遍进行计算,另外,返回值result一定要写,否则就直接退出程序了。 } } } return result; } public static void main(String[] args) { String result=""; Closures Clo=new Closures(); Map map=new HashMap();//由HashMap实现Map对象 int rely=0;//计算输入了几个依赖 System.out.println("请输入依赖,输入end结束输入!"); while(true){ Scanner in=new Scanner(System.in); String str=in.nextLine();//扫描器执行当前行 if(str.toLowerCase().equals("end"))//匹配结束符 { break; } String s[]=str.split("->"); if(s.length==2){ map.put(s[0].toUpperCase(),s[1].toUpperCase());//将每个函数依赖以值对的形式存入HashMap中 rely++; } } Clo.printout(map); System.out.println("请输入所要求的闭包!输入end结束输入"); while(true) { Scanner in=new Scanner(System.in); result=in.nextLine().toUpperCase(); if(result.toLowerCase().equals("end")) { break; } result=Clo.calculate(result,map); System.out.println("所要求的闭包为:"+result); } } }

示例输入:


请输入依赖!输入end结束输入

a->b

b->c

end

请输入所要求的闭包!输入end结束输入
a

end

然后就输出了a的闭包,还有个求函数依赖的算法暂时还没写,等下次再更新好了。

猜你在找的设计模式相关文章