1. 程式人生 > >求XF+閉包(第十一屆河南省省賽真題)

求XF+閉包(第十一屆河南省省賽真題)

DC 規範 UC 合並 sizeof mstr ace 實際應用 ont

題目描述

如何設計一個好的數據庫不僅僅是一個理論研究問題,也是一個實際應用問題。在關系數據庫中不滿足規範化理論的數據庫設計會存在冗余、插入異常、刪除異常等現象。

設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 }

求XF+閉包(第十一屆河南省省賽真題)