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

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

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值