Next:4.13
Порождение сочетаний
Up:4
Разработка алгоритмов
Previous:4.11
Порождение перестановок
Известно, что наиболее простым способом порождения всех двоичных векторов
длины
является счет в системе счисления с основанием 2, как это сделано в следующем
алгоритме:
В качестве начального берется вектор из нулей
;
while B # (1, 1, ..., 1) do
Вывести текущее значение
;
Пусть
-- наименьший номер нулевого элемента в
;
Положить
равным 1 и каждое
,
равным нулю
end;
Вывести текущее значение
.
Понятно, что этот алгоритм не порождает подмножества в порядке минимального
изменения, поскольку в порождаемой последовательности соседние наборы могут
различаться во всех позициях. Например, соседними являются наборы
и
.
Наименьшим возможным изменением при переходе от одного подмножества
к другому является добавление или удаление одного элемента множества, что
соответствует изменению только одного элемента в текущем двоичном векторе.
Существуют и такие последовательности длиной
всех
-разрядных
двоичных наборов (кодовых слов), что последовательные кодовые слова различаются
в одном разряде. Такие последовательности называются кодами Грея.
Рекурсивное определение
-разрядного
кода Грея
можно сформулировать следующим образом:
![]()
![]()
=
для любого
где
означает обращение двоичного слова
-- слово, получающееся выписыванием элементов слова
в обратной последовательности. Например, ![]()
![]()
![]()
.
Коды Грея
удобно представлять их последовательностью переходов
,
т.е. упорядоченным списком номеров разрядов (пронумерованных справа налево),
которые меняются при переходе от одного кодового слова к другому. Например,
.
Для
можно указать довольно простое рекурсивное определение:
и
для любого
Next:4.13
Порождение сочетаний
Up:4
Разработка алгоритмов
Previous:4.11
Порождение перестановок