求XF+闭包(第十一届河南省省赛真题)
题目描述
如何设计一个好的数据库不仅仅是一个理论研究问题,也是一个实际应用问题。在关系数据库中不满足规范化理论的数据库设计会存在冗余、插入异常、删除异常等现象。
设R(U)是一个关系模式,U={ A1,A2, ……, An}。其中Ai是关系的属性,X,Y是U的子集。函数依赖 X->Y 定义了数据库中属性集X与Y的依赖关系。根据Armstrong公理,函数依赖满足:
(1) 自反律:若Ai∈X, 则 X->Ai . 特别地,Ai ->Ai .
(2) 增广律:若 X->Y, 则 ZX->ZY. (ZX 是指集合Z与X的并集 )
(3) 传递律:若 X->Y, Y->Z, 则 X->Z.
(4) 分解律:若 X->Y, 则 X->Ai ( 若属性Ai∈Y )
(5) 合并律:若 X->Y, XàZ, 则 X->YZ.
已知 F 是关系模式R(U)上的函数依赖集,利用Armstrong公理系统可以推导出更多的函数依赖。设X是属性集U={ A1,A2, ……, An} 的子集, 定义X关于F的闭包XF+
XF+={ Ai | 若X-> Ai可以通过Armstrong公理导出}
对于给定的U , F ,X, 请求出XF+
输入
第一行: T 表示以下有T组测试数据 ( 1≤T ≤5 )
对每组数据,
第1行: n m k n 表示U中属性个数( 1≤n≤26 ), 用大写字母表示
m表示X中属性个数( 1≤m≤26 )
k个函数依赖 (1≤ k ≤ 20 )
第2行: 字符串U n个大写字母
第3行: 字符串X m个大写字母
接下来有K行,每行有两个字符串 S T,用一个空格隔开。 表示 SàT
输出
对每组测试数据,输出占一行输出XF+,要求按字母序输出。
样例输入
1 6 2 4 ABGDCI AD A B BD I AG C C D
样例输出
ABDI
1 /* 2 问题 3 输入F和X以及若干个依赖关系,输出X关于F的闭包 4 5 解题思路 6 简单理一下题目,就是在X的基础上还能加入多少属性,也就是依赖关系右边的集合,如何根据一个函数依赖判断该集合能不 7 能加入到结果中是关键,能不能的判断依据是函数依赖的左集合能否在当前的结果中找到,如果能够找到就将右集加入。 8 还需注意,如果一个依赖关系的右集的字典序越小,表明该属性越有可能作为一个属性集,从而推出更多的属性。 9 */ 10 #include<cstdio> 11 #include<cstring> 12 #include<string> 13 #include<algorithm> 14 15 using namespace std; 16 char a[50],b[50]; 17 int book[50]; 18 int ok(char c[]); 19 struct NODE{ 20 char c[50],d[50]; 21 }node[50]; 22 23 int cmp(struct NODE a,struct NODE b){ 24 string s1,s2; 25 s1=a.d; 26 s2=b.d; 27 return s1<s2; 28 }; 29 int main() 30 { 31 //freopen("E:\\testin.txt","r",stdin); 32 int T,n,m,k,i,j; 33 scanf("%d",&T); 34 while(T--){ 35 scanf("%d%d%d",&n,&m,&k); 36 scanf("%s%s",a,b); 37 38 memset(book,0,sizeof(book)); 39 for(i=0;i<m;i++){ 40 book[b[i]-'A']++; 41 } 42 43 for(i=0;i<k;i++){ 44 scanf("%s%s",node[i].c,node[i].d); 45 } 46 sort(node,node+k,cmp); 47 for(i=0;i<k;i++){ 48 if(ok(node[i].c)){//加入 49 for(j=0;node[i].d[j] != '\0';j++){ 50 book[node[i].d[j]-'A']++; 51 } 52 } 53 } 54 for(i=0;i<26;i++){ 55 if(book[i] != 0) 56 printf("%c",i+65); 57 } 58 puts(""); 59 } 60 return 0; 61 } 62 63 int ok(char c[]) 64 { 65 int lc=strlen(c); 66 for(int i=0;i<lc;i++){ 67 if(book[c[i]-'A'] == 0) 68 return 0; 69 } 70 return 1; 71 }