闲的没事干,看了看数据库的求闭包的。顺便将代码页实现了。如果有错请指出。
#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]!=' ') { 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 */ (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|