Минимальное покрытие и функциональные зависимости
учитывая следующие функциональные зависимости, как бы я вычислил минимальное покрытие:
A -> B, ABCD -> E, EF -> GH, ACDF -> EG
в лекционных заметках он дает вывод для минимального покрытия, но я его не понимаю.
например для избавления от ACDF - > E:
A -> B => AACD -> BACD -> E => ACD -> E => ACDF -> E
и тогда они говорят, что аналогично мы не держим ACDF - > G
и тогда я пойму, что ABCD - > E is вывод ACD - > E, потому что A - > B, но я не понимаю формального процесса, как добраться до этого.
Итак, мой вопрос: Может ли кто-нибудь объяснить, как создать минимальное покрытие для набора функциональных зависимостей?
2 ответов
чтобы получить минимальное покрытие, вы должны сделать два шага. Чтобы продемонстрировать, я сначала разделю зависимости на несколько (только один атрибут справа), чтобы сделать его более чистым:
A -> B
ABCD -> E
EF -> G
EF -> H
ACDF -> E
ACDF -> G
следующее должны выполняйте в этом порядке (#1, а затем #2), иначе вы можете получить неверный результат.
1) Избавьтесь от избыточных атрибутов (уменьшите левые стороны):
возьмите каждую левую сторону и попробуйте удалить по одному атрибуту затем попробуйте вывести правую сторону (которая теперь является только одним атрибутом для всех зависимостей). Если вам это удалось, вы можете удалить эту букву с левой стороны, а затем продолжить. Обратите внимание, что может быть несколько правильных результатов, это зависит от порядка, в котором вы делаете сокращение.
вы узнаете, что вы можете удалить B
от зависимостей ABCD -> E
, потому что ACD -> ABCD
(используйте первый dep.) и от 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
, спрячьте его сейчас, вы видите, что вы ничего не можете вывести из . Поэтому это правило не является избыточным. Сделайте то же самое для всех остальных. Вы узнаете ,что вы можете (очевидно) удалить одно из повторяющихся правил ACD -> E
, но строго говоря, вы можете использовать этот алгоритм. Скройте только одно из двух одинаковых правил, затем возьмите левую сторону (ACD
), и используйте другой, чтобы вывести правую сторону. Поэтому вы можете удалить ACD -> E
(только один раз курс.)
вы также увидите, что вы можете удалить ACDF -> G
, потому что ACDF -> ACDFE -> G
. Теперь результат:
A -> B
EF -> G
EF -> H
ACD -> E
который является минимальной крышкой исходного набора.
по моему мнению, в вышеуказанные функциональные минимальные зависимости ACDF - > G также должны быть включены, потому что при закрытии каждой буквы с левой стороны и их комбинации ни одна из них не производит G без включения F
Так было бы следующим образом:
(A - > B, EF - > G, EF - > H, ACD - > E, ACDF - > G )