Next:5
Выбор представления данных
Up:4
Разработка алгоритмов
Previous:4.12
Порождение подмножеств множества
Рассматривая порождение всех подмножеств множества фиксированной мощности , т.е. всех сочетаний из предметов по штук, как обычно, будем предполагать, что основным множеством является подмножество натуральных чисел .
Наиболее естественно рассматривать представление сочетания в виде вектора , в котором компоненты сочетания расположены в порядке возрастания слева направо (т.е. = и для любого ), и порождать эти векторы в лексикографическом порядке. Так, например, все 20 сочетаний из шести предметов по три (т.е. трехэлементные подмножества множества ) образуют следующую лексикографически упорядоченную последовательность векторов: (1,2,3), (1,2,4), (1,2,5), (1,2,6), (1,3,4), (1,3,5), (1,3,6), (1,4,5), (1,4,6), (1,5,6), (2,3,4), (2,3,5), (2,3,6), (2,4,5), (2,4,6), (2,5,6), (3,4,5), (3,4,6), (3,5,6), (4,5,6).
Для порождения сочетаний (более точно, соответствующих векторов) в лексикографическом порядке можно воспользоваться следующим алгоритмом:
В качестве начального взять вектор C = (1, 2, ..., );
while ~ (Для любого
выполняется )
do
Выдать текущее значение C;
Найти такое максимальное ,
что ;
В качестве
взять ,
а для всех ,
начиная от
и кончая ,
положить
равным
end;
Выдать текущее значение C.
Начинается порождение с сочетания . Каждое следующее сочетание строится из предыдущего с помощью следующих простых действий: в ходе просмотра текущего сочетания справа налево в нем находится самый первый элемент, который еще не достиг своего максимального значения; этот элемент увеличивается на единицу, а всем элементам справа от него последовательно приписываются новые наименьшие возможные значения.
Рассмотрим порождение сочетаний в порядке наименьшего изменения, т.е. таким образом, чтобы каждое последующее сочетание получалось из предыдущего заменой только одного элемента. Это означает, что последовательность двоичных слов, представляющих сочетания в этом порядке, состоит из так называемых слов (-разрядных двоичных слов по единиц в каждом), и обладает тем свойством, что любые два соседних слова в последовательности различаются ровно в двух разрядах (позициях). Эту последовательность слов
можно рекурсивно определить следующим образом:
=
.
Индукцией по можно доказать, что такое определение задает последовательность, которая получается удалением из кода Грея всех кодовых слов с числом единиц, не равным , и в ней любые два соседних кодовых слова различаются только в двух позициях.
Next:5
Выбор представления данных
Up:4
Разработка алгоритмов
Previous:4.12
Порождение подмножеств множества