求某属性集的函数依赖集的闭包运算

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

闲的没事干,看了看数据库的求闭包的。顺便将代码页实现了。如果有错请指出。

#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 */

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