要获得最小的覆盖范围,您必须执行两个步骤.为了演示,我将首先将依赖项拆分为多个(右侧只有一个属性),以使其更清晰:
A -> B
ABCD -> E
EF -> G
EF -> H
ACDF -> E
ACDF -> G
请按以下顺序(#1,然后#2)执行以下步骤must,否则可能会得到错误的结果.
1) 消除冗余属性(减少左侧):
取左侧,并try 每次删除一个属性,然后try 推导出右侧(现在所有依赖项只有一个属性).如果您成功了,则可以从左侧取出该字母,然后继续.请注意,可能有多个正确的结果,这取决于您执行缩减的顺序.
您会发现,您可以从依赖项ABCD -> E
中删除B
,因为ACD -> ABCD
(使用first dep.)从ABCD -> E
开始.您可以使用完整的Dep.你目前正在减少,这一开始有时会令人困惑,但如果你仔细想想,就会发现你可以做到这一点.
同样,您可以从ACDF -> E
中删除F
,因为ACD -> ABCD -> ABCDE -> E
(您显然可以从字母本身推导出单个字母).完成此步骤后,您将获得:
A -> B
ACD -> E
EF -> G
EF -> H
ACD -> E
ACDF -> G
这些规则仍然代表与原始规则相同的依赖关系.请注意,现在我们有一个重复的规则ACD -> E
.如果你把整个事情看作一个集合(在数学意义上),那么当然你不可能在一个集合中有两个相同的元素.现在,我只是把它放在这里两次,因为下一步无论如何都会把它处理掉.
2) 摆脱多余的依赖关系
现在,对于每个规则,try 删除它,看看是否只使用其他规则来推断相同的规则.当然,在这一步中,您不能使用dep.您当前正试图删除它(您可以在上一步中删除).
如果你把第一条规则A -> B
的左边隐藏起来,你会发现你无法从A
中推断出任何东西.因此,这条规则并非多余.对所有其他人也一样.你会发现,你可以(显然)删除其中一个重复的规则ACD -> E
,但严格来说,你也可以使用算法.只隐藏两条相同规则中的一条,然后取左侧(ACD
),用另一条来推断右侧.因此,您可以删除ACD -> E
(当然只能删除一次).
你还会看到你可以go 掉ACDF -> G
,因为ACDF -> ACDFE -> G
.现在的结果是:
A -> B
EF -> G
EF -> H
ACD -> E
这是原版的最小封面.