• 求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] != '';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 }
  • 相关阅读:
    LeetCode——4Sum
    LeetCode——3Sum
    LeetCode——Longest Repeating Character Replacement
    LeetCode——Longest Palindromic Subsequence
    LeetCode——Longest Word in Dictionary through Deleting
    剑指Offer——丑数
    剑指Offer——最长不包含重复字符的子字符串
    剑指Offer——把数组排成最小的数
    LAMP第四部分mysql操作
    LAMP第三部分php,mysql配置
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/9129829.html
Copyright © 2020-2023  润新知