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