Это в лекции 3. |
Хорновские формулы и задача получения продукции
Алгоритм БыстроеЗамыкание(X,F)
I) Инициализация: 1. ДЛЯ КАЖДОГО процесса t принадлежит F ВЫПОЛНЯТЬ 2. { СЧЕТ[t] := |Lt|; 3. ДЛЯ КАЖДОГО a принадлежит Lt ВЫПОЛНЯТЬ 4. добавить t в СПИСОК[a]; 5. } ; 6. НОВЫЕ := X; ОБНОВА := X; II) Вычисление: 7. ПОКА ОБНОВА не пусто ВЫПОЛНЯТЬ 8. { выбрать a принадлежит ОБНОВА; ОБНОВА := ОБНОВА \ {a}; 9. ДЛЯ КАЖДОГО t принадлежит СПИСОК[a] ВЫПОЛНЯТЬ 10. { СЧЕТ[t] := СЧЕТ[t] - 1; 11. ЕСЛИ СЧЕТ[t] = 0 12. ТО 13. ЕСЛИ {bt} не принадлежит НОВЫЕ 14. ТО { НОВЫЕ := НОВЫЕ объединить { bt}; 15. ОБНОВА := ОБНОВА объединить {bt} } 16. } 17. }; 18. вернуть(НОВЫЕ).
Следующая теорема утверждает корректность приведенного алгоритма.
Теорема 6.3. Алгоритм БыстроеЗамыкание(X,F) строит замыкание .
Доказательство этого утверждения аналогично доказательству теоремы 6.2 (см. задачу 6.3).
Отметим, что число шагов алгоритма БыстроеЗамыкание(X,F) пропорционально размеру его входа, т.е. числу продуктов в F и X или числу букв в записи формулы (*). Такие алгоритмы называются работающими в линейное (от размера входа) время или, просто, линейными. Действительно, при инициализации каждый элемент F рассматривается 2 раза, а в основном цикле общее число рассматриваемых элементов и операций уменьшения на 1 значений СЧЕТ[t] в стр.10 алгоритма не больше суммы размеров всех Lt, т.е. также не превосходит размера входа.
Пример 6.3. Рассмотрим работу алгоритма БыстроеЗамыкание на следующем примере. Пусть A={a, b, c, d, e, f, g, h}, X = { b,f}, а множество F состоит из следующих 6 процессов:
- a,b,c,h -> d;
- b,c,d -> a;
- g,b -> e;
- e,f -> c;
- f,e -> d;
- b,f -> g.
Тогда при инициализации будут построен массив СЧЕТ = [4, 3, 2, 2, 2, 2] и следующие списки:
Множества ДОБАВКА и НОВЫЕ будут инициализированы в стр. 6 булевскими массивами 01000100 с 1 на местах, соответствующих продуктам b и f. Дальнейшие изменения этих структур представлены в следующей таблице.
СЧЕТ | ДОБАВКА | НОВЫЕ | |||||
---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | abcdefgh | abcdefgh |
4 | 3 | 2 | 2 | 2 | 2 | 01000100 | 01000100 |
3 | 2 | 1 | 2 | 2 | 1 | 00000100 | 01000100 |
3 | 2 | 1 | 1 | 1 | 0 | 00000010 | 01000110 |
3 | 2 | 0 | 1 | 1 | 0 | 00001000 | 01001110 |
3 | 2 | 0 | 0 | 0 | 0 | 00110000 | 01111110 |
2 | 1 | 0 | 0 | 0 | 0 | 00010000 | 01111110 |
2 | 0 | 0 | 0 | 0 | 0 | 10000000 | 11111110 |
1 | 0 | 0 | 0 | 0 | 0 | 00000000 | 11111110 |
Алгоритм завершает работу, когда множество ДОБАВКА становится пустым. В этот момент результат Cl(X,F) представлен множеством НОВЫЕ. В нашем примере оно равно {a,b,c, d,e,f,g}.
Задачи
Задача 6.1. Докажите, что последовательность процессов в доказательстве теоремы 6.1 определена корректно, т.е. все исходные продукты каждого процесса в этой последовательности имеются перед его запуском.
Задача 6.2. Докажите теорему 6.2.
Указание. Пусть Xk - это состояние множества НОВЫЕ после k итераций основного цикла алгоритма ЗАМЫКАНИЕ в строках 2-6. Покажите, что для каждого продукта , который может быть получен из X последовательностью процессов длины k, z входит в Xk.
Задача 6.3. Алгоритм ПрямаяВолна(X,y,F) позволяет ответить на вопрос о возможности производства y из исходных продуктов X с помощью процессов F, но в случае положительного ответа не строит последовательность процессов, приводящую к y. Измените алгоритм ЗАМЫКАНИЕ(X,F) так, чтобы по его результату для любого продукта можно было построить последовательность процессов, приводящую к a.
Задача 6.4. Назовем сложным технологическим процессом (или производством)} такой процесс t, который по набору исходных продуктов Lt производит некоторое множество продуктов Bt (а не один продукт bt ). Обобщите алгоритм ЗАМЫКАНИЕ(X,F) так, чтобы он строил замыкание X относительно системы сложных технологических процессов F.
Задача 6.5. Определите, какая последовательность процессов в примере 6.3 приводит к получению a.
Задача 6.6. Используя алгоритм ЗАМЫКАНИЕ (X,F), вычислить замыкание для набора исходных продуктов X = { c,d} и следующей системы технологических процессов F:
- a,b,d -> h;
- a,c,d,g -> f;
- d,g -> b;
- e,f -> c;
- b,k -> a;
- d,c -> k;
- h,d,c -> g;
- d,g ,a -> e;
- c, d, k -> h.
Определите, какая последовательность процессов приводит к получению e.
Задача 6.7. Докажите теорему 6.3.
Указание. Пусть Xk - это состояние множества НОВЫЕ после k итераций основного цикла алгоритма БыстроеЗамыкание в строках 7-17. Покажите, что
- если на (k+1) -ой итерации основного цикла для некоторого процесса t обнаруживается, что СЧЕТ[t] = 0, то ;
- для каждого продукта , который может быть получен из X последовательностью процессов длины k, z входит в Xk ;
- условие выхода из основного цикла выполнено после (k+1) -ой итерации тогда и только тогда, когда Xk= Xk+1.
Задача 6.8. Измените алгоритм БыстроеЗамыкание так, чтобы по его результату для любого продукта можно было построить последовательность процессов, приводящую к a.
Задача 6.9. Используя алгоритм БыстроеЗамыкание, вычислить замыкание для набора исходных атрибутов X = { a,f} и следующей системы зависимостей F:
- a,b,c -> h;
- a,c,d,g -> h;
- e,f -> c;
- f,a -> d;
- g,d -> e;
- d,f ,a -> g.
Определите, какая последовательность процессов приводит к получению h.