闭包求解算法
对R<U , F>,求属性X(X ⊆ U)关于U上的函数依赖集F的闭包XF+
输入:X,F
输出:XF+
步骤:
- 令X0 =X,i =0;
- 求MID,这里的 MID ={A| (∃V) (∃W) (V→W ∈ F ⋀ V ⊆Xi ⋀ A∈W ) }; 也就是说先令MID’ 为空集,对于F中的每一个函数依赖Y→Z,满足属性集Y⊆Xi ,那么MID’ =MID’ ∩ Z;最终的MID’ 即为所求的MID
- Xi+1 =MID∪Xi
- 判断Xi+1 =Xi 是否相等
- 若相等或Xi+1 = U,则Xi+1 就是XF+ ,算法终止。
- 若不相等,则令i = i +1,返回第(2)步。
最小依赖集解法
一、定义
最小函数依赖集也称为极小函数依赖集、最小覆盖;如果函数依赖集 F 满足下列条件,则称 F 为一个最小依赖集。
- F 中任意函数依赖的右部仅含有一个属性
- F 中不存在这样的函数依赖X→A,使得 F 与 F - {X→A}等价,即 F 中的函数依赖均不能由 F 中其他函数依赖导出
- F 中不存在这样的函数依赖X→A,X有真子集 Z 使得 F - {X→A} ∪ {Z→A}与 F 等价,即 F中各函数依赖左部均为最小属性集(不存在冗余属性)
例题如下:
U=(A,B,C,D,E,G) F={BG->C,BD->E,DG->C,ADG->BC,AG->B,B->D},求F最小依赖集。
解:
第一步:右边单一化。
F1={BG->C,BD->E,DG->C,ADG->B,ADG->C,AG->B,B->D}
第二步:逐个求,在去掉它的F中求闭包,如果包含右边属性,则表示这个函数依赖要去掉。
BG->C:求(BG)+=BCDEG,包含右边属性C,所以去掉。
BD->E:(BD)+=BD,不包含右边E,所以不用去掉。
DG->C:(DG)+=DG,也不用去掉。
ADG->B:(ADG)+=U,包含B,所以去掉。
ADG->C:(ADG)+包含C,去掉。(在这里,求闭包的时候,不能再用前面去掉的函数依赖了,所以如果从后往前判断,可能不用去掉ADG->B,所以最小依赖集不唯一,写出一个即可。)
AG->B:(AG)+=AG,不用去掉。
B->D:(B)+=B,不用去掉。
所以F2={BD->E,DG->C,AG->B,B->D}
第三步:对左边属性单一化,根据上图判断是否可以替代。
BD->E:
- B->E,求(B)+=BDE,包含E,所以可以替代。
- D->E,求(D)+=D,不包含E,所以不可以替代。
所以用B->E代替BD->E。
DG->C:
- D->C,(D)+=D,不包含C,所以不可以替代。
- G->C,(G)+=G,不包含C,所以不可以替代。
AG->B:
- A->B,(A)+=A,不包含B,所以不可以替代。
- G->B,(G)+=G,不包含B,所以不可以替代。
所以Fmin={B->E,DG->C,AG->B,B->D}。