Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
X
- •ПРЕДИСЛОВИЕ
- •1.1. Основные понятия и обозначения
- •1.2. Битовая шкала множества
- •2.3. Бинарные коды Грея
- •2.4. Порядок выполнения задания
- •1.4. Отношения над множествами
- •1.5. Расстояние между множествами
- •1.6. Порядок выполнения задания
- •1.7. Варианты
- •2.1. Формулировка задачи
- •2.2. Счет в двоичной системе счисления
- •2.5. Варианты
- •3.1. Определение комбинаторных объектов
- •3.2. Генерация сочетаний
- •3.3. Генерация перестановок
- •3.4. Порядок выполнения задания
- •3.5. Варианты
- •ГЛАВА 2. АЛГОРИТМЫ НА ГРАФАХ
- •4.1. Основные понятия и обозначения
- •4.2. Отношения и операции
- •4.3. Родственные графам объекты
- •4.4. Способы машинного представления
- •4.5. Порядок выполнения задания
- •4.6. Варианты
- •5.1. Обход вершин графа в глубину или ширину
- •5.2. Базовые задачи на графах
- •5.3. Порядок выполнения задания
- •5.4. Варианты
- •6.1. Формулировка задачи
- •6.2. Алгоритм Краскала
- •6.3. Алгоритм Прима
- •6.4. Некоторые замечания
- •6.5. Порядок выполнения задания
- •6.6. Варианты
- •7.1. Формулировка задачи
- •7.5. Кратчайшие контуры и транзитивное замыкание
- •7.6. Порядок выполнения задания
- •7.7. Варианты
- •ГЛАВА 3. АЛФАВИТНОЕ КОДИРОВАНИЕ
- •8.1. Основные понятия и обозначения
- •8.2. Формулировка задачи
- •8.3. Критерии однозначного декодирования
- •8.4. Порядок выполнения задания
- •8.5. Варианты
- •9.1. Средняя длина элементарного кода
- •9.2. Формулировка задачи
- •9.3. Свойства оптимальных кодов
- •9.4. Алгоритм Хаффмена
- •9.5. Сжатие текстов
- •9.6. Порядок выполнения задания
- •9.7. Варианты
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •АЛФАВИТНЫЙ УКАЗАТЕЛЬ
- •ОГЛАВЛЕНИЕ

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, B ⊆ X с битовыми шкалами (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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
