闲的没事干,看了看数据库的求闭包的。顺便将代码页实现了。如果有错请指出。
#include<iostream>
#include<string>
#include<bitset>
#include<string.h>
#include<map>
#define ELE 26 //U 属性集合 最多为26个
#define R 50 //输入的F的函数依赖集的元素个数最多为50 个
using namespace std;
int match[R][ELE]={-1};
bitset<26> b[R]; //
bitset<26> unit;// 集合
bitset<26> X;//表示当前的属性集合
int used[R]={0};//表示F函数依赖集的每一个函数依赖是否已经用过
int t;
int main()
{
int i,j,k,flag;
int num,ele;
string str;
cout<<"**************闭包的计算************************************\n";
cout<<"输入属性几个的个数:<只用输入个数,系统会自动生成ABC......Z>\n";
cin>>ele;
cout<<"系统生成的属性集合是:\n";
for(j=0;j<ele;j++)
{
cout<<""<<(char)(j+'A')<<"\t";
unit[j]=1;
}
cout<<endl<<unit;
cout<<"\n请输入F函数依赖集的大小:\n";
cin>>num;
cin.get();
cout<<"请输入函数依赖 <like AB->C>\n";
for(i=0;i<num;i++)
{
str="";
getline(cin,str); //假设输入的都是正确的值
j=str.length();
k=0;
flag=0;
while(str[k]!='\0')
{
if((str[k]>='a'&&str[k]<='z')||(str[k]<='Z'&&str[k]>='A'))
{
t=(str[k]-'a'>=0)?(str[k]-'a'):(str[k]-'A');
if(flag==0)
match[i][t]=1; //依赖函数x->y 的x部分
else
b[i][t]=1; //依赖函数的x->y 的y部分
}
else //遇到—>的时候
flag=1;
++k;
}
}
cin.get(); //*****************************
str="";
cout<<"请输入要计算的属性集:\n";
getline(cin,str);
k=str.length();
for(i=0;i<k;i++)
{
t=(str[i]-'a'>=0)?(str[i]-'a'):(str[i]-'A');
X[t]=1;
}
cout<<"********************闭包计算结果**************************\n";
cout<<"属性集{"<<str<<"}"<<"在集合{";
for(i=0;i<ele-1;i++)
cout<<(char)(i+'A')<<",";
cout<<(char)((ele-1)+'A')<<"}的关于F函数依赖的闭包是:{";
flag=0;
bitset<26> temp;
while(!flag)
{
if(unit==X||X==temp)
{
flag=1;
continue;
}
if(temp!=0)
X=temp;
else
temp=X;
for(i=0;i<num;i++) //每次从头开始扫描F
{
if(!used[i])
{
for(j=0;j<ele;++j)
{
if(match[i][j]==0||(match[i][j]==1&&X[j]==1))
continue;
else
break;
}// # end for
if(j>=ele)
{
used[i]=1;
for(int loop=0;loop<ele;loop++) //进行异或操作
temp[loop]=b[i][loop]?1:temp[loop];
}
}
//# end if
}//# end for
}
for(j=0;j<ele-1;j++)
if(X[j]==1)
cout<<(char)(j+'A')<<",";
if(X[ele-1]==1)
cout<<(char)((ele-1)+'A')<<"}\n";
} /* AB->C B->D C->E EC->B AC->B */
原文链接:/javaschema/286202.html