最小函数依赖集

说明

我在csdn上看过几篇求最小依赖集的方法,感觉他们有的各不相同,甚至有的不太理解,或者有的叙述错误,看了一些资料,在此进行总结,求最小函数依赖集方法

定义

如果函数依赖集F满足下列条件,则称F为一个极小函数依赖集,亦称为最小依赖集或最小覆盖。

①F中任一函数依赖的右部仅含有一个属性。
②F中不存在这样的函数依赖X→A,使得F与F-{X→A}。
③F中不存在这样的函数依赖X→A,X有真子集Z使得F-{X→A}∪{Z→A}与F等价。

求解方法

①将F中的所有依赖右边化为单一元素。简记:右部单属性

②去掉F中的所有依赖左边的冗余属性。简记:去掉左部冗余

③去掉F中所有冗余依赖关系。简记:去掉冗余依赖。

注意
切记求解步骤为①②③,不能调换,若调换为①③②,则在消除左部冗余使F发生变化后,需要重新进行消除函数冗余依赖的操作

我的解释

①右部单属性,如X→BC,则把它拆为X→B,X→C。理论依据为分解规则:由X→Y,及Z⊆Y,有X→Z。

②去掉左部冗余,如在第①步后,得到的函数依赖集为F1,对其中形如AB→ Y,进行考察:

1.去掉A,得B→Y,继续基于F1,计算B+,若B+包含Y,则可以去掉A,即以B→Y替换原式的AB→ Y。若两个都能去掉,保留其中一个即可,同时也可以看出最小函数依赖的结果并不一定是唯一的,其实它也和上面②处理冗余的顺序以及③处理冗余的顺序有关系

注意
注意是基于F1,即在第①步后获得的F1,去掉A,得到B→Y,而在计算B的闭包时,F中依然是AB→ Y

2.去掉B,得A→Y,继续基于F1,计算A+,若A+包含Y,则可以去掉B,即以A→Y替换原式的AB→ Y。

例如

求得

F1={①ABD→C,②C→B,③AD→B,④ AD→F,⑤ B→E}。

去除A:

计算BD在F1上的闭包BD+=BDE不包含C,所以不能去掉。

理解:

如果BD+包含C,说明能由F1导出BD→C,

而由Armstrong公理系统中的增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含。

因为BD→C,A⊆U,所以有ABD→AC为F1所蕴含。

再由分解规则:由X→Y,及Z⊆Y,有X→Z。

可得C⊆AC,所以有ABD→C。

设ABD去掉左部A后,得到的新的函数依赖集为F2

这里引入一个概念,在关系模式R<U,F>中为F所逻辑蕴含的函数依赖的全体叫作F的闭包,记为F+。个人理解,就是F中的各种函数依赖,利用推理规则,所能推出来的所有公式的集合。

显然有F1+⊆F2+ (因为F2能导出F1集合的所有元素,显然有F2逻辑蕴含的函数依赖的全体肯定包括F1逻辑蕴含的函数依赖的全体,即F1+⊆F2)

而BD+包含C,说明能由F1导出BD→C,即F1能导出F2集合的所有元素。

同上,显然有F2+⊆F1+ 

再由引理F+=G+的充分必要条件是F+⊆G+,G+⊆F+

下面给出看到过的另一种判断方法

去掉A得到得到新的函数依赖集F2={①BD→C,②C→B,③AD→B,④ AD→F,⑤ B→E}。如果BD在F2上的闭包和BD在F1上的闭包相等,则可以去掉。

注意
不要记混了,计算闭包是在F1上,而不是把F1中ABD→C改成BD→C,再计算闭包,因为如果AB→C,如果记混了,B→C去替换AB→C,再在此基础上计算B的闭包,必然有B+=BC,因为B→C,所以B+包含C,这样判别是毫无意义的

例题

设有函数依赖集F={C→A, A→B, B→C, C→B, A→C, BC→A},求其最小函数依赖集Fmin。

第一步,右部单属性:

原式不改变。

第二步,消除左部冗余:

BC→A,A在(B)F+=ABC中,A在(C)F+=ABC中,保留一个BC中的一个即可。

  1. 保留B:C→A, A→B, B→C, C→B, A→C, B→A
  2. 保留C:C→A, A→B, B→C, C→B, A→C

第三步去掉冗余依赖:

1.若保留B:C→A, A→B, B→C, C→B, A→C, B→A

考察C→A,去掉C→A后,A→B, B→C, C→B, A→C,B→A, C+=ABC,A在C+中,可以去掉。变为A→B, B→C, C→B, A→C, B→A

考察A→B,去掉A→B后,B→C, C→B, A→C, B→A,A+=ABC,B在A+中,可以去掉。变为B→C, C→B, A→C, B→A

考察B→C,去掉B→C后, C→B, A→C, B→A,B+=ABC,C在B+中,可以去掉。变为C→B, A→C, B→A

考察C→B,去掉C→B后,A→C, B→A,C+=C,B不在C+中,不可以去掉

考察A→C,去掉C→B后,C→B, B→A,A+=A,C不在A+中,不可以去掉

考察B→A,去掉B→A后,C→B, A→C,,B+=B,A不在B+中,不可以去掉

结束,得到Fmin={C→B, A→C, B→A}

2.若保留C:C→A, A→B, B→C, C→B, A→C

考察C→A,去掉C→A后,A→B, B→C, C→B, A→C, C+=BC,A不在C+中,不可以去掉

考察A→B,去掉A→B后,C→A, B→C, C→B, A→C, A+=ABC,B在A+中,可以去掉

变为C→A, B→C, C→B, A→C

考察B→C,去掉B→C后, C→A,C→B, A→C, B+=B,C不在B+中,不可以去掉。

考察C→B,去掉C→B后,C→A,B→C, A→C, C+=AC,不在C+中,不可以去掉。

考察A→C,去掉A→C后, C→A, B→C, C→B, A+=A,C不在A+中,不可以去掉。

结束,得到Fmin={C→A, B→C, C→B, A→C }

综上:Fmin={C→B, A→C, B→A}或Fmin={C→A, B→C, C→B, A→C }

在第三步中换一种考察顺序

如果先考察A→C,A+=ABC,C在其中,可以去掉,变为C→A, A→B, B→C, C→B

考察C→A,C+=BC,A不在C+中,不能去

考察 A→B,A+=A,B不在A+中,不能去

考察 B→C,B+=B,C不在B+中,不能去

考察C→B,C+=ABC,B在C+中,可以去掉变为C→A, A→B, B→C

有Fmin={C→A, A→B, B→C},又得到了一个最小依赖集

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值