Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать

1.4. Отношения над множествами

Рассмотрим правила, с помощью которых проверяются основ­ные отношения над множествами, при условии, что множества заданы битовыми шкалами.
Отношение принадлежности элемента множеству. Пусть мно-
жество ментом множества
битовыми шкалами (
А содержится в В (А В), если для любого i = l, ..., n справедливо не-
равенство
только тогда, когда соответствующие им битовые шкалы равны, т. е.
a
A X – это число элементов, принадлежащих А (обозначается как | А |).
Если множество
Множества номощны, когда |
3, 4, 5, 6, 7, 8, 9, 10}. Рассмотрим четыре его подмножества:
A X задано шкалой (a
А, если а
Отношение включения
a
, ..., an) и (b1, ..., bn) соответственно. Множество
1
, ..., an). Элемент хi X является эле-
1
= 1.
i
. Пусть множества A, B X определены
a
bi.
i
Отношение равенства. Множества A, B X равны тогда и
для любого i = l, ..., n.
i = bi
Отношение равномощности. Мощность конечного множества
A X задано битовой шкалой (a
n
i
aA
.||
i
=
1
=
A, BX с битовыми шкалами (a
| = |
А
|, что отвечает равенству
В
n
i
n
=
i
ba
.
i
==
11
i
, ..., an), то
1
, ..., an) и (b1, ..., bn) рав-
1
Пример 1.3. Пусть задано универсальное множество
X = {1, 2,
A = {1, 2, 3, 4, 5}, B = {5, 3, 1, 2, 4},
C = {4, 5, 6, 7, 10}, D = {1, 10, 7, 4, 5, 6}.
Битовые шкалы этих множеств указаны в табл. 1.3. Здесь того,
А, В, C, D X. Множества A и B равны. Равномощными являются
такие пары множеств:
A и B, A и C, B и C.
C D. Кроме
11
Таблица 1.3
Множество Битовая шкала
X 1 1 1 1 1 1 1 1 1 1
A 1 1 1 1 1 0 0 0 0 0
B 1 1 1 1 1 0 0 0 0 0
C 0 0 0 1 1 1 1 0 0 1
D 1 0 0 1 1 1 1 0 0 1

1.5. Расстояние между множествами

При решении некоторых задач требуется определить «близость» заданного множества к множеству, выполняющему роль эталона (об­разца). В этих случаях пользуются понятием «расстояние».
Пусть множества
a
, ..., an) и (b1, ..., bn) соответственно. Расстоянием Хемминга ме-
ми (
1
жду множествами
c
, …, cn) – битовая шкала множества C = А В. Таким образом,
где (
1
расстояние Хемминга битовые шкалы множеств
Относительным расстоянием Хемминга между множествами A, B X называется число, определяемое формулой
A, B X определены своими битовыми шкала-
A и B называется число d
=
d
(A, B) задает количество разрядов, в которых
h
i
h
n
cBAd
,),(
ih
=
1
(A, B), равное
A и B отличаются друг от друга.
В отличие от
d
(A, B) данное число является безразмерной величиной,
h
и для него верны границы
Очевидно, что
BAd
),(
h
BAd
),(
0
h
=
0
h
00
hh
.
n
.1),(0
BAd
.1),(,0),(
== AAdAAd
12
Пример 1.4. Пусть
X = {х
, х2, x3, x4, х5} и множества A, B, C X
1
заданы битовыми шкалами (табл. 1.4).
Множество Битовая шкала
A 0 1 1 0 0
B 1 0 0 1 1
C 1 0 0 1 1
Битовые шкалы указывают, что
Таблица 1.4
А =
и В = С. Поэтому имеем
B
h
h
,5),( =BAd
0
h
,0),( =CBd
0
h
Если допустить, что шкала множества
h
,3),( =BAd
0
h
,1),(
=BAd
.0),(
=CBd
А равна (0, 1, 1, 1, 1), то
0,6.5/3),(
==BAd
Необходимо отметить, что когда мощность универсального множества
Х = {х
, ..., хn} велика, а его подмножества не очень велики,
1
то применение битовых шкал не является эффективным с точки зрения объема используемой памяти. В этом случае целесообразно применять списки. Алгоритмы вычисления операций над множествами, заданны­ми упорядоченными списками, можно найти в работе [19].

1.6. Порядок выполнения задания

1.6.1. Изучить формулы расчета расстояний Хемминга, правила образования битовых шкал для основных теоретико-множественных операций и отношений. Реализовать их в виде программных процедур. Каждую из них оформить так, чтобы, с одной стороны, ее можно было автономно тестировать, а с другой – использовать при разработке про­грамм решения задач. Оценить вычислительную сложность процедур по времени и используемой памяти в зависимости от n – длины бито­вых шкал (см. рекомендации в прил. 1).
1.6.2. Разработать и отладить программу решения задач, связан­ных с почтовым индексом.
13

1.7. Варианты

О почтовом индексе. Для написания цифр почтового индекса принято использовать множество ны буквами на рис. 1.1, а сами цифры изображены на рис. 1.2. Здесь множество
X играет роль универсального множества. Будем считать,
что его элементы перечисляются в алфавитном порядке:
X = {a, b, c, d, e, f, g, h, i}.
Следует для каждой из десяти цифр записать множество элементы которого образуют запись этой цифры, и найти соответст­вующую битовую шкалу. Так, цифре 0 отвечает множество
d, f, h, i} и битовая шкала (1, 1, 0, 1, 0, 1, 0, 1, 1). Требуется разработать
программу, которая позволяла бы по
А
(k = 0, ..., 9) решить задачи, указанные в табл. 1.5.
k
X из 9 элементов, которые обозначе-
X и битовым шкалам множеств
a
c
b d
f
e
g
h
i
Рис. 1.1
А
(k = 0, ..., 9),
k
A
= {a, b,
0
Рис. 1.2
14
Таблица 1.5
Номер
варианта
Задача
1
Найти среди Аk (k = 0, ..., 9) пары непересекающихся множеств.
Для заданной цифры найти все цифры, которые отсто­ят от нее не более чем на 1
3 (в смысле относитель-
/
ного расстояния Хемминга)
2
Найти среди А
(k = 0, ..., 9) пары равномощных
k
множеств. Для заданной цифры найти наиболее близкую ей циф-
ру (в смысле расстояния Хемминга)
3
Найти среди Аk (k = 0, ..., 9) пары множеств, для кото­рых справедливо отношение включения.
Для заданного почтового индекса найти пару наименее близких цифр (в смысле расстояния Хемминга)
4
Найти среди Аk (k = 0, ..., 9) множества, содержащие заданный элемент х X.
А
Найти среди
(k = 0, ..., 9) пару наиболее близких
k
множеств (в смысле расстояния Хемминга)
5
Для каждого элемента х X найти число множеств
А
, в которые он входит.
k
А
Найти среди
(k = 0, ..., 9) пару наименее близких
k
множеств (в смысле расстояния Хемминга)
6
Найти элемент х X, который наиболее редко исполь­зуется в Аk (k = 0, ..., 9).
Для заданной цифры найти наименее близкую цифру
(в смысле расстояния Хемминга)
15
ЗАДАНИЕ 2
Генерация всех подмножеств
конечного множества
Во многих переборных алгоритмах необходимо последователь­но рассмотреть все подмножества некоторого конечного множества и среди них найти то, которое удовлетворяет заданному условию. Ино­гда бывает важно, чтобы каждое последующее подмножество отлича­лось от предыдущего наименьшим образом. Изучить известные мето­ды генерации подмножеств конечного множества и получить практи­ческие навыки программной реализации переборных алгоритмов – цель задания.

2.1. Формулировка задачи

Пусть задано универсальное конечное множество Х = {х1, ..., xn}. Требуется построить все различные его подмножества. Это задача на построение комбинаторных объектов подмножеств конечного множества. Заметим, что множество Х имеет в точности 2n различных подмножеств. Каждое из подмножеств A X однозначно задается битовой шкалой (a1, ..., an), т. е. двоичным вектором длины n. Значит, построение всех различных подмножеств множества Х = {х1, ..., xn} можно свести к генерации всех n-разрядных двоичных векторов.
Рассмотрим три популярных алгоритма генерации двоичных век­торов [5, 17]. В них двоичные векторы формируются в одномерном массиве B = (B[1], …, B[n]) длины n, элементы которого принимают значения 0 и 1. На вход алгоритмов поступает целое число n > 0.

2.2. Счет в двоичной системе счисления

Самый простой метод генерации всех двоичных векторов счет в
двоичной системе счисления, как это осуществляется в алгоритме 2.1.
Алгоритм 2.1. Порождение n-разрядных двоичных векторов
1. В качестве начального взять вектор B = (0, ..., 0), т. е. для каждо­го i = 1, …, n выполнить присваивание В[i]:= 0.
16
2. Если В = (1, ..., 1), то перейти на пункт 6. Иначе идти дальше.
3. Вывести текущее значение В.
4. Найти m как наибольшее значение i, для которого В[i] = 0.
5. Положить B[m]:= 1 и для каждого j = m + 1, …, n выполнить присваивание B[j]:= 0. Вернуться к пункту 2.
6. Вывести текущее значение В. Останов.
Нетрудно убедиться, что данный алгоритм последовательно ге-
нерирует двоичные разложения целых чисел 0, 1, …, 2n –1.
Пример 2.1. В табл. 2.1. приведены результаты работы алго-
ритма 2.1 для n = 3. Заметим, что при записи вектора B во втором столбце этой таблицы опущены (для краткости) скобки и разделяющие запятые.
Таблица 2.1
Целое число
i Вектор В Значение m
0 000 3
1 001 2
2 010 3
3 011 1
4 100 3
5 101 2
6 110 3
7 111
Из предоставленного примера видно, что в алгоритме 2.1 после-
довательно получаемые подмножества могут сильно отличаться друг от друга. Так, соседние двоичные наборы (0, 1, 1) и (1, 0, 0) различаются во всех разрядах и соответствуют непересекающимся подмножествам.

2.3. Бинарные коды Грея

Рассмотрим метод генерации всех n-разрядных двоичных векто-
ров в таком порядке, что каждый последующий двоичный вектор полу­чается из предыдущего изменением одного разряда, что отвечает добав­лению в подмножество или удалению из него лишь одного элемента.
17
Данный метод опирается на следующий факт. Если последова-
тельность двоичных векторов
B
, B2, ..., Bm
1
k
m = 2
содержит все от вектора
B
i + 1
векторов длины k, причем вектор B
в точности в одном разряде (i = 1, ..., m – l), то после-
довательность
B
0, B2 0, ..., Bm 0, Bm l, B
1
l, ..., B1 1
m 1
отличается
i
содержит все двоичные векторы длины
k + 1, причем каждые два со-
седних вектора также отличаются только в одном разряде. Получаемая этим способом последовательность двоичных векторов
B
, B2, ..., Bm,
1
n
m = 2
где
, называется бинарным кодом Грея порядка n.
Из данного определения непосредственно следует алгоритм 2.2
рекурсивного построения кода Грея. Согласно данному алгоритму по­следовательность двоичных векторов кода Грея порядка
B
ся на основе последовательности торов кода Грея порядка
k.
, B2, ..., Bm (m = 2k) двоичных век-
1
k + 1 строит-
Алгоритм 2.2. Рекурсивное построение кода Грея
1. Поместить 0 после каждого двоичного вектора Bi (i = 1, …, m). Получится последовательность
B
0, B2 0, ..., Bm 0.
1
2. Реверсировать последовательность B1, B2, ..., Bm, т. е. изменить
порядок перечисления двоичных векторов на обратный. В полу­ченной последовательности после каждого двоичного вектора записать 1. Результирующая последовательность примет вид
B
m
l, B
l, ..., B1 1.
m − 1
3. Поместить последовательность, построенную в пункте 2, вслед за последовательностью из пункта 1.
Пример 2.2. Построим бинарный код Грея порядка n = 3. Оче-
видно, что коду Грея порядка
n = 1 соответствует последовательность
из двух одноразрядных двоичных векторов:
18
0, 1.
Поместим 0 после каждого из указанных двоичных векторов. При за­писи этих векторов скобки и разделяющие запятые опустим (точно так же будем кратко записывать двоичные вектора и далее). В результате получим последовательность
, 10.
00
Реверсируем последовательность 0, 1 и поместим 1 после каждого из ее элементов. В результате придем к последовательности
, 01.
11
В итоге для
n = 2 получим
, 10, 11, 01.
00
Чтобы построить код Грея порядка
сле каждого элемента приведенной последовательности и 1 после эле­ментов реверсированной последовательности. В результате имеем
, 100, 110, 010, 011, 111, 101, 001.
000
Процесс нерекурсивного построения кода Грея порядка
лизует следующий алгоритм.
Алгоритм 2.3. Нерекурсивное построение кода Грея
1. Вначале взять вектор B = (0, ..., 0), т. е. для каждого i = 1, …, n выполнить присваивание B[i]:= 0.
2. Положить i:= 0, где iчисло построенных на данный момент двоичных векторов.
3. Вывести текущее значение B.
4. Положить i:= i + 1.
5. Найти р наибольшую степень двойки, которая делит нацело i.
6. Если р < n, то инвертировать разряд с номером (p + 1) надлежа-
щим образом: B[p + 1]:= 1 – B[p + 1]. Далее вернуться к пунк­ту 3. В противном случае останов.
Пример 2.3. Последовательность двоичных векторов, порож-
денных алгоритмом 2.3 для n = 3, приведена в табл. 2.2.
n = 3, вновь запишем 0 по-
n реа-
19
Таблица 2.2
i – число
созданных
двоичных
векторов
0 000
1
0 1 100
2 1 2 110
3 0 1 010
4 2 3 011
5 0 1 111
6 1 2 101
7 0 1 001
р – наибольшая
степень двойки, делящая нацело
число i
(p + 1) – номер
инвертируемого
разряда
Двоичный
вектор B

2.4. Порядок выполнения задания

2.4.1. Изучить алгоритмы 2.1–2.3. Оценить вычислительную
сложность алгоритмов. Реализовать один из них – тот, что указан в варианте задания (табл. 2.3), в виде программной процедуры. Оформ­ление процедуры должно допускать ее автономное тестирование. Осуществить тестирование с помощью примеров 2.1–2.3.
2.4.2. Написать и отладить программу решения оптимизацион-
ной задачи, используя метод исчерпывающего поиска (табл. 2.3). Най-
условия, при которых задача не имеет решения. Проверку этих ус-
ти ловий предусмотреть в программе. Определить способы внешнего и внутреннего представления исходных, промежуточных и результи­рующих данных. Указать набор тестов для контроля правильности работы программы. Использовать рекомендации, приведенные в прил. 2. Оценить сложность решения задачи по времени и памяти.
20
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]