您的位置:首页 > 数据库

数据库,求属性集闭包和函数依赖集闭包的算法实现

2015-12-05 16:23 447 查看
数据库老师布置的作业题目,求属性集闭包和函数依赖集闭包的算法实现

我用比较简单的方法算了一下

欢迎交流

import java.util.*;

public class QiuBiBao_DBtext {
public static void main(String[] args)
{
System.out.println("请输入函数依赖,假设所有的属性都用大写字母A到Z来表示。");
System.out.println("请先输入函数依赖左边的属性,在输入函数依赖右边的属性。结束时输入END。");
String[] Left=new String[10];
String[] Right=new String[10];
int count=0;
while(true)
{
Scanner in=new Scanner(System.in);
String str=in.nextLine();

if(str.compareTo("END")==0)
{
break;
}
else//将函数依赖的属性分左右分别放在两个数组中。
{
count++;
if(count%2==1)
{
Left[(count+1)/2]=str;
}
else
{
Right[(count/2)]=str;
}
}
if(count%2==0)
{
System.out.println("完成第"+count/2+"个依赖:"+Left[count/2]+"->"+Right[count/2]);
}
}
//求属性闭包的运算。
while(true)
{
System.out.println("请输入需要求得属性集:");
Scanner in_1=new Scanner(System.in);
String str=in_1.nextLine();
if(str.compareTo("END")==0)
{
break;
}
QiuShuXingBiBao.qiuShuXingBiBao(Left,Right,str,count);
}
System.out.println("你输入的函数依赖的闭包F+是:");
QiuHanShuYiLaiBiBao.qiuHanShuYiLaiBiBao(Left,Right,count);
}

//求属性集的闭包==================================================================================================================
static class QiuShuXingBiBao
{
public static String qiuShuXingBiBao(String[] Left,String[] Right,String str,int count)
{
String str_temp1=new String(str);
while(true)
{
String str_temp=new String(str);
for(int i=1;i<=count/2;i++)
{
if(baoHan(str,Left[i]))
{
str_temp=TianJia(str_temp,Right[i]);
}
}
if(str.compareTo(str_temp)==0)
{
System.out.println(str_temp1+"+"+"的属性集为:"+str);
return str;
}
else
{
str=str_temp;
}
}
}
public static Boolean baoHan(String a,String b)//a是否包含b
{
char[] arr=b.toCharArray();
int count=0;
int len=b.length();
for(int i=0;i<len;i++)
{
if(a.indexOf(arr[i])!=-1)
{
count=count+1;
}
}
if(count==len)
{
return true;
}
else
{
return false;
}
}
public static String TianJia(String str,String str2)
{
char[] arr=str2.toCharArray();
for(int i=0;i<arr.length;i++)
{
if(str.indexOf(arr[i])==-1)
{
str=str+arr[i];
}
}
return str;
}
}

//求函数依赖的闭包==================================================================================================================
static class QiuHanShuYiLaiBiBao
{
public static void qiuHanShuYiLaiBiBao(String[] Left,String[] Right,int count)
{
//找出所有的属性放在str中。
String str="";
for(int i=1;i<=count/2;i++)
{
char[] arr1=Left[i].toCharArray();
char[] arr2=Right[i].toCharArray();
for(char ch:arr1)
{
if(str.indexOf(ch)==-1)
{
str=str+ch;
}
}
for(char ch:arr2)
{
if(str.indexOf(ch)==-1)
{
str=str+ch;
}
}
}
char[] arr3=str.toCharArray();
//---------------------------------------
int len=str.length();
int sum=ciFang(len);
//求出函数依赖左边属性集所有可能情况,用二进制表示,1表示有,0表示没有。
for(int i=1;i<sum;i++)
{

StringBuffer binary= new StringBuffer(Integer.toBinaryString(i));
binary.reverse();
String str1=new String(binary);
char[] arr4=str1.toCharArray();
char
a2f2
[] arr5=new char[len];
for(int j=0;j<len;j++)
{
if(j<str1.length())
{
arr5[j]=arr4[j];
}
else
{
arr5[j]='0';
}
}
//求出当前要求的一个依赖的左边属性集str2。
String str2="";
for(int k=0;k<len;k++)
{
if(arr5[k]!='0')
{
str2=str2+arr3[k];
}
}
//-------------------------------------------------
//求该属性集闭包str3。
String str3=new String(QiuShuXingBiBao.qiuShuXingBiBao(Left, Right, str2, count));
char[] arr8=str3.toCharArray();
//求该属性集可以作为左边可以形成的依赖。
int len1=str3.length();
int sum1=ciFang(len1);

//求该属性集作为左边可以推出的右边,用二进制表示,1表示有,0表示没有。
for(int s=0;s<sum1;s++)
{
StringBuffer binary1=new StringBuffer(Integer.toBinaryString(s));
binary1.reverse();
String str4=new String(binary1);
char[] arr6=str4.toCharArray();
char[] arr7=new char[len];
for(int w=0;w<len1;w++)
{
if(w<str4.length())
{
arr7[w]=arr6[w];
}
else
{
arr7[w]='0';
}
}
//求出当前要求的一个依赖的右边属性集str5。
String str5="";
for(int x=0;x<len1;x++)
{
if(arr7[x]!='0')
{
str5=str5+arr8[x];
}
}
//输出一个依赖。
if(str5.compareTo("")!=0)
{
System.out.println(str2+"->"+str5);
}
else
{
System.out.println(str2+"->"+"NULL");
}
}
}
}
public static int ciFang(int n)//求2的n次方。
{
int res=1;
for(int i=0;i<n;i++)
{
res=res*2;
}
return res;
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据库 闭包 算法