Text
                    Ф.А. Новиков
С^ППТЕР'
ИСКРЕТНДЯ
МАТЕМАТИКА
ДЛЯ ПРОГРАММИСТОВ
УЧЕБНИК
•	систематическое
изложение основных
разделов дискретной
математики
•	описание важнейших
алгоритмов над
объектами дискретной
математики
• основные способы
представления
объектов дискретной
математики с помощью
стандартных структур
данных

Рецензенты: Кафедра «Прикладная математика» Санкт-Петербургского государственного технического университета Лавров С. С., доктрр технических наук, профессор, член-корреспондент Российской академии наук Н73 Дискретная математика для программистов / Ф. А. Новиков — СПб: Питер, 2000. — 304 с.: ил. ISBN 5-272-00183-4 В учебнике изложены основные разделы дискретной математики и описаны важнейшие алгоритмы на дискретных структурах данных. Основу книги составляет материал лекционного курса, который автор читает в Санкт-Петербургском государственном техническом университете последние полтора десятилетия. Для студентов вузов, практикующих программистов и всех желающих изучить дискретную математику. ББК 32.973-018Я7+22.174 УДК 681.3.06:51(075) Электронная версия скачана с сайта http://irodov.nm.ru/other/files.htm ISBN 5-272-00183-4 © Ф. А. Новиков, 2000 © Серия, оформление, Издательский дом «Питер», 2000
Краткое содержание ГЛАВА 1. Множества и отношения ГЛАВА 2. Алгебраические структуры ГЛАВА 3. Булевы функции ГЛАВА 4. Логические исчисления ГЛАВА 5. Комбинаторика ГЛАВА 6. Кодирование ГЛАВА 7. Графы ГЛАВА 8. Связность ГЛАВА 9. Деревья ГЛАВА 10. Циклы ГЛАВА 11. Независимость и покрытия . ГЛАВА 12. Раскраска графов Литература Алфавитный указатель
19 51 . . 79 .100 .134 .159 .189 .210 .234 .260 .269 .281 .290 .292
Содержание Вступительное слово 12 Введение 13 ГЛАВА 1. Множества и отношения...................................... .. 19 1.1. Множества...................................................... . . 19 1.1.1. Элементы и множества .................................... .. 20 1.1.2. Задание множеств......................................... .. 21 1.1.3. Парадокс Рассела ........................................ .. 21 1.2. Операции над множествами....................................... . . 22 1.2.1. Сравнение множеств ...................................... .. 22 1.2.2. Операции над множествами................................. .. 23 1.2.3. Разбиения и покрытия .................................... . . 23 1.3. Алгебра подмножеств............................................ . . 24 1.3.1. Булеан................................................... . . 25 1.3.2. Свойства операций над множествами ....................... . . 25 1.4. Представление множеств в ЭВМ .................................. . . 26 1.4.1. Реализация операций над подмножествами заданного универсума U .. 27 1.4.2. Генерация всех подмножеств универсума.................... . . 27 1.4.3. Алгоритм построения бинарного кода Грея.................. .. 28 1.4.4. Представление множеств упорядоченными списками................. ..29 1.4.5. Проверка включения слиянием.............................. . . 30 1.4.6. Вычисление объединения слиянием.......................... . . 30 1.4.7. Вычисление пересечения слиянием ......................... . . 32 1.5. Отношения...................................................... . . 33 1.5.1. Упорядоченные пары ............................................ ..33 1.5.2. Прямое произведение множеств .................................. ..33 1.5.3. Отношения................................................ . . 34 1.5.4. Композиция отношений .................................... . . 34 1.5.5. Степень отношения ....................................... . . 35 1.5.6. Ядро отношения........................................... . . 35 1.5.7. Свойства отношений ...................................... . . 36 1.5.8. Представление отношений в ЭВМ ................................. ..37 1.6. Функции........................................................ . . 38 1.6.1. Определения ............................................. . . 38 1.6.2. Инъекция, сюръекция и биекция............................ . . 39 1.6.3. Индуцированная функция................................... . . 40 1.6.4. Представление функций в ЭВМ ............................. . . 41 1.7. Отношения эквивалентности ..................................... .. 41 1.7.1. Определения ............................................. . . 42
Содержание 1.7.2. Классы эквивалентности ....................... 1.7.3. Фактормножества............................... 1.7.4. Ядро функции ................................. 1.8. Отношения порядка................................... 1.8.1. Определения .................................. 1.8.2. Минимальные элементы.......................... 1.8.3. Алгоритм топологической сортировки ........... 1.8.4. Монотонные функции............................ 1.9. Замыкание отношений................................. 1.9.1. Замыкание отношения относительно свойства..... 1.9.2. Транзитивное и рефлексивное транзитивное замыкания 1.9.3. Алгоритм Уоршалла ............................ Комментарии ............................................. Упражнения ....................................-......... ГЛАВА 2. Алгебраические структуры............... 2.1. Операции и алгебры......................... 2.1.1. Алгебраические структуры............. 2.1.2. Замыкания и подалгебры............... 2.1.3. Алгебра термов ...................... 2.1.4. Система образующих................... 2.1.5. Свойства операций ................... 2.2. Морфизмы................................... 2.2.1. Гомоморфизм.......................... 2.2.2. Изоморфизм .......................... 2.3. Алгебры с одной операцией................. 2.3.1. Полугруппы .......................... 2.3.2. Моноиды ............................. 2.3.3. Группы............................... 2.4. Алгебры с двумя операциями................. 2.4.1. Кольца............................... 2.4.2. Области целостности.................. 2.4.3. Поля................................. 2.5. Векторные пространства .................... 2.5.1. Определения ........................ 2.5.2. Свойства нуль-вектора............... 2.5.3. Линейные комбинации................. 2.5.4. Базис и размерность................. 2.6. Решетки.................................... 2.6.1. Определения ........................ 2.6.2. Ограниченные решетки ............... 2.6.3. Решетка с дополнением............... 2.6.4. Частичный порядок в решетке ........ 2.6.5. Булевы алгебры . . . .,............. 2.7. Матроиды .................................. 2.7.1. Определения ........................ 2.7.2. Максимальные независимые подмножества 2.7.3. Базисы.............................. 2.7.4. Ранг ............................... 2.7.5. Жадный алгоритм..................... 2.7.6. Примеры матроидов................... Комментарии .................................... Упражнения .....................................
6 Содержание ГЛАВА 3. Булевы функции.................................................... .79 3.1. Элементарные булевы функции .......................................... -79 3.1.1. Функции алгебры логики ......................................... -79 3.1.2. Существенные и несущественные переменные...... .80 3.1.3. Булевы функции одной переменной............... -81 3.1.4. Булевы функции двух переменных ............... -81 3.2. формулы ............................................ -81 3.2.1. Реализация функций формулами ................................... -82 3.2.2. Равносильные формулы............................................ -84 3.2.3. Подстановка и замена ........................................... -84 3.2.4. Алгебра булевых функций......................................... -85 3.3. Принцип двойственности................................................ -86 3.4. Нормальные формы...................................................... -88 3.4.1. Разложение булевых функций по переменным...... -88 3.4.2. Совершенные нормальные формы.................................... -89 3.4.3. Построение СДНФ................................................. -90 3.4.4. Алгоритм вычисления значения булевой функции.. -91 3.4.5. Эквивалентные преобразования.................................... -92 3.5. Замкнутые классы ..................................................... -94 3.5.1. Замыкание множества булевых функций ............................ .94 3.5.2. Некоторые замкнутые классы...................................... -94 3.6. Полнота............................................................... -96 Комментарии ............................................................... -98 Упражнения .....'.......................................................... -98 ГЛАВА 4. Логические исчисления .......................... . .100 4.1. Логические связки................................... ..101 4.1.1. Высказывания ................................. . .101 4.1.2. Формулы ...................................... . .101 4.1.3. Интерпретация................................. . .102 4.1.4. Логическое следование и логическая эквивалентность . . .103 4.1.5. Подстановки................................. . .104 4.2. Формальные теории................................... . .105 4.2.1. Определение формальной теории ................ ..105 4.2.2. Выводимость................................... . .106 4.2.3. Интерпретация................................. . .106 4.2.4. Общезначимость и непротиворечивость........... . .107 4.2.5. Полнота, независимость и разрешимость......... . .107 4.3. Исчисление высказываний............................................. ..108 4.3.1. Классическое определение исчисления высказываний . . .108 4.3.2. Частный случай формулы....................................... ..109 4.3.3. Алгоритм унификации ......................................... ..109 4.3.4. Конструктивное определение исчисления высказываний . .110 4.3.5. Производные правила вывода .................................. ..111 4.3.6. Дедукция..................................................... ..112 4.3.7. Некоторые теоремы теории £ .................................. ..114 4.3.8. Множество теорем теории £ ................................... ..116 4.3.9. Другие аксиоматизации исчисления высказываний ... . .118 4.4. Исчисление предикатов............................................... ..118 4.4.1. Определения ................................................. ..119 4.4.2. Интерпретация................................ . .121 4.4.3. Общезначимость .............................. . .122 4.4.4. Полнота чистого исчисления предикатов ....................... ..122
Содержание 7 4.4.5. Логическое следование и логическая эквивалентность 123 4.4.6. Теория равенства................................................. 123 4.4.7. Формальная арифметика............................................ 124 4.4.8. Теория (абелееых) групп.......................................... 124 4.4.9. Теоремы Гёделя о неполноте....................................... 126 4.5. Автоматическое доказательство теорем................................... 127 4.5.1. Постановка задачи............................................... 127 4.5.2. Доказательство от противного..................................... 128 4.5.3. Сведение к предложениям.......................................... 128 4.5.4. Правило резолюции для исчисления высказываний . . 130 4.5.5. Правило резолюции для исчисления предикатов .... 131 4.5.6. Опровержение методом резолюций................................... 131 4.5.7. Алгоритм метода резолюций ...................................... ,132 Комментарии ............................................................... ,133 Упражнения ................................................................ ,133 ГЛАВА 5. Комбинаторика ...................................................... 134 5.1. Комбинаторные конфигурации............................................ 135 5.1.1. Комбинаторные задачи............................................ 135 5.1.2. Размещения...................................................... 135 5.1.3. Размещения без повторений ...................................... 136 5.1.4. Перестановки.................................................... 136 5.1.5. Сочетания ...................................................... 137 5.1.6. Сочетания с повторениями........................................ 138 5.2. Подстановки.............................................................138 5.2.1. Группа подстановок ................................................139 5.2.2. Графическое представление подстановок..............:..............140 5.2.3. Циклы ............................................................140 5.2.4. Подстановки и перестановки ........................................141 5.2.5. Инверсии..........................................................141 5.2.6. Генерация перестановок............................................142 5.3. Биномиальные коэффициенты ..............................................144 5.3.1. Элементарные тождества............................................144 5.3.2. Бином Ньютона ....................................................145 5.3.3. Свойства биномиальных коэффициентов ..............................146 5.3.4. Треугольник Паскаля ............................................ 146 5.3.5. Генерация подмножеств.............................................147 5.4. Разбиения ..............................................................148 5.4.1. Определения ......................................................148 5.4.2. Числа Стирлинга второго рода......................................149 5.4.3. Числа Стирлинга первого рода......................................150 5.4.4. Число Белла......................................................150 5.5. Принцип включения и исключения .........................................151 5.5.1. Объединение конфигураций.........................................151 5.5.2. Принцип включения и исключения ..................................152 5.5.3. Число булевых функций, существенно зависящих от всех своих переменных . 153 5.6. Формулы обращения ......................................................153 5.6.1. Теорема обращения................................................153 5.6.2? формулы обращения для биномиальных коэффициентов.................154 5.6.3. Формулы для чисел Стирлинга......................................155 5.7. Производящие функции....................................................156 5.7.1. Основная идея....................................................156 5.7.2. Метод неопределенных коэффициентов...............................157
8 Содержание Комментарии 157 Упражнения 157 ГЛАВА 6. Кодирование ..................................................... -159 6.1. Алфавитное кодирование............................................... -161 6.1.1. Префикс и постфикс слова................ .161 6.1.2. Таблица кодов .......................... -161 6.1.3. Разделимые схемы.............................................. -162 6.1.4. Префиксные схемы ............................................. -162 6.1.5. Неравенство Макмиллана........................................ -163 6.2. Кодирование с минимальной избыточностью............................. -165 6.2.1. Минимизация длины кода сообщения.............................. .165 6.2.2. Цена кодирования ............................................. -166 6.2.3. Алгоритм фано................................................. -167 6.2.4. Оптимальное кодирование....................................... -168 6.2.5. Алгоритм Хаффмена............................................. -170 6.3. Помехоустойчивое кодирование........................................ -172 6.3.1. Кодирование с исправлением ошибок ............................ -172 6.3.2. Классификация ошибок ......................................... -173 6.3.3. Возможность исправления всех ошибок..... -173 6.3.4. Кодовое расстояние............................................ -174 6.3.5. Код Хэмминга для исправления одного замещения .175 6.4. Сжатие данных....................................................... -177 6.4.1. Сжатие текстов ............................................... -177 6.4.2. Предварительное построение словаря............................ .178 6.4.3. Алгоритм Лемпела—Зива......................................... .179 6.5. Шифрование ......................................................... -180 6.5.1. Криптография ................................................. .181 6.5.2. Шифрование с помощью случайных чисел.... .181 6.5.3. Криптостойкость .............................................. -182 6.5.4. Модулярная арифметика ........................................ .183 6.5.5. Шифрование с открытым ключом.................................. -185 6.5.6. Цифровая подпись.............................................. .187 Комментарии ............................................................. .188 Упражнения ............................................................. .188 ГЛАВА 7. Графы ..................... . .189 7.1. Определения графов ............ ..189 7.1.1. История теории графов.... ..190 7.1.2. Основное определение .... . .191 7.1.3. Смежность................ ..191 7.1.4. Диаграммы ............... ..192 7.1.5. Другие определения....... . .192 7.1.6. Изоморфизм графов ....... . .193 7.2. Элементы графов................ . .194 7.2.1. Подграфы ................ . .194 7.2.2. Валентность.............. . .194 7.2.3. Маршруты, цепи, циклы.... . .195 7.2.4. Расстояние между вершинами . ..196 7.2.5. Связность ............... ..197 7.3. Виды графов и операции над графами . .197 7.3.1. Тривиальные и полные графы . . . .197 7.3.2. Двудольные графы......... . .197
Содержание 9 7.3.3. Направленные орграфы и сети....... 199 7.3.4. Операции над графами ............................................ 199 7.4. Представление графов в ЭВМ ............................................ 201 7.4.1. Требования к представлению графов . . . 201 7.4.2. Матрица смежности................................................ 201 7.4.3. Матрица инциденций.............................................. .202 7.4.4. Списки смежности................................................ .202 7.4.5. Массив дуг...................................................... .203 7.4.6. Обходы графов .................................................. .203 7.5. Орграфы и бинарные отношения ......................................... .206 7.5.1. Графы и отношения .............................................. .206 7.5.2. Достижимость и частичное упорядочение .206 7.5.3. Транзитивное замыкание ......................................... .207 Комментарии ............................................................... -208 Упражнения ................................................................ -209 ГЛАВА 8. Связность......................................................... .210 8.1. Компоненты связности.................................................. .210 8.1.1. Объединение графов и компоненты связности....................... .210 8.1.2. Точки сочленения................................................ .211 8.1.3. Оценка числа ребер через число вершин и число компонент связности .211 8.2. Вершинная и реберная связность........................................ .212 8.2.1. Мосты и блоки................................................... .212 8.2.2. Меры связности.................................................. .214 8.3. Теорема Менгера....................................................... .214 8.3.1. Непересекающиеся цепи и разделяющие множества................... .215 8.3.2. Теорема Менгера в «вершинной форме» ............................ .215 8.3.3. Варианты теоремы Менгера........................................ .217 8.4. Теорема Холла......................................................... -218 8.4.1. Задача о свадьбах .............................................. .218 8.4.2. Трансверсаль.................................................... .218 8.4.3. Совершенное паросочетание....................................... .218 8.4.4. Теорема Холла — формулировка и доказательство.................. -218 8.5. Потоки в сетях........................................................ -220 8.5.1. Определение потока.............................................. -221 8.5.2. Разрезы.......................................................... -221 8.5.3. Теорема Форда и фалкерсона ...................................... -222 8.5.4. Алгоритм нахождения максимального потока......................... -223 8.5.5. Связь между теоремой Менгера и теоремой Форда и фалкерсона . . . .225 8.6. Связность в орграфах .................................................. -226 8.6.1. Сильная, односторонняя и слабая связность ....................... -226 8.6.2. Компоненты сильной связности ................................... .226 8.6.3. Выделение компонент сильной связности ........................... -227 8.7. Кратчайшие пути ....................................................... -228 8.7.1. Длина дуг........................................................ -228 8.7.2. Алгоритм Флойда.................................................. -229 8.7.3. Алгоритм Дейкстры ............................................... -230 Комментарии ................................................................ -232 Упражнения ................................................................. -232 ГЛАВА 9. Деревья . . . 234 9.1. Свободные деревья -234 9.1.1. Определения .234
10 Содержание 9.1.2. Основные свойства деревьев.......................................235 9.2. Ориентированные, упорядоченные и бинарные деревья......................238 9.2.1. Ориентированные деревья..........................................238 9.2.2. Эквивалентное определение ордерева...............................240 9.2.3. Упорядоченные деревья......................................... ..241 9.2.4. Бинарные деревья ............................................. ..242 9.3. Представление деревьев в ЭВМ...................................... . .243 9.3.1. Представление свободных, ориентированных и упорядоченных деревьев . .243 9.3.2. Представление бинарных деревьев .................................244 9.3.3. Обходы бинарных деревьев ..................................... ..244 9.3.4. Алгоритм симметричного обхода бинарного дерева...................245 9.4. Деревья сортировки.....................................................246 9.4.1. Ассоциативная память.......................................... ..246 9.4.2. Способы реализации ассоциативной памяти ...................... ..247 9.4.3. Алгоритм бинарного (двоичного) поиска............................248 9.4.4. Алгоритм поиска в дереве сортировки..............................248 9.4.5. Алгоритм вставки в дерево сортировки ............................249 9.4.6. Алгоритм удаления из дерева сортировки ..........................250 9.4.7. Вспомогательные алгоритмы для дерева сортировки............. . .251 9.4.8. Сравнение представлений ассоциативной памяти ....................252 9.4.9. Выровненные деревья .............................................253 9.4.10. Сбалансированные деревья .................................... ..254 9.5. Кратчайший остов ...........................................Л..... . .255 9.5.1. Определения .....................................................256 9.5.2. Схема алгоритма построения кратчайшего остова .............. . .256 9.5.3. Алгоритм Краскала........................................... . .257 Комментарии ........................................................... . .259 Упражнения ............................................................ . .259 ГЛАВА 10. Циклы ............................................................260 10.1. Фундаментальные циклы и разрезы.......................................260 10.1.1. Циклы и коциклы ................................................260 10.1.2. Независимые множества циклов и коциклов........................261 10.1.3. Циклический и коциклический ранг...............................261 10.2. Эйлеровы циклы........................................................263 10.2.1. Эйлеровы графы ............................................... 263 10.2.2. Алгоритм построения эйлерова цикла в эйлеровом графе ..........264 10.2.3. Оценка числа эйлеровых графов .................................265 10.3. Гамильтоновы циклы....................................................265 10.3.1. Гамильтоновы графы.............................................266 10.3.2. Задача коммивояжера ...........................................267 Комментарии ................................................................268 Упражнения .........'.......................................................268 ГЛАВА 11. Независимость и покрытия .........................................269 11.1. Независимые и покрывающие множества...................................269 11.1.1. Покрывающие множества вершин и ребер...........................269 11.1.2. Независимые множества вершин и ребер...........................270 11.1.3. Связь чисел независимости и покрытий...........................270 11.2. Построение независимых множеств вершин................................272 11.2.1. Постановка задачи отыскания наибольшего независимого множества вершин 272 11.2.2. Поиск с возвратами ............................................273 11.2.3. Улучшенный перебор ............................................274
Содержание 1 "| 11.2.4. Алгоритм построения максимальных независимых множеств вершин ,276 11.3. Доминирующие множества.............................................. .277 11.3.1. Определения .................................................. .277 11.3.2. Доминирование и независимость................................. .277 11.3.3. Задача о наименьшем покрытии.................................. .278 11.3.4. Эквивалентные формулировки ЗНП ............................. .278 11.3.5. Связь ЗНП с другими задачами ................................. .279 Комментарии .............................................................. .280 Упражнения ............................................................... .280 ГЛАВА 12. Раскраска графов................................................ .281 12.1. Хроматическое число .................................... .281 12.2. Планарность......................................................... .283 12.2.1. Укладка графов ............................................... .283 12.2.2. Эйлерова характеристика....................................... .284 12.2.3. Теорема о пяти красках ....................................... .285 12.3. Алгоритмы раскрашивания............................................. .286 12.3.1. Точный алгоритм раскрашивания ................................ .286 12.3.2. Приближенный алгоритм последовательного раскрашивания .287 12.3.3. Улучшенный алгоритм последовательного раскрашивания .. .288 Комментарии .............................................................. .289 Упражнения ............................................................... .289 Литература 290 Алфавитный указатель 292
Вступительное слово Автор этой книги Ф. А. Новиков имеет большой опыт практического программи- рования, чтения лекций по дискретной математике и написания книг, посвящен- ных различным вопросам вычислительной техники и ее программного обеспече- ния. Все это позволило ему создать книгу, наполненную обширным й интересным материалом. Она предназначена для студентов младших курсов, специализиру- ющихся в области программирования, но будет полезна не только им, но и всем тем, кто обучается или стремится повысить квалификацию в направлениях, тесно связанных с программированием, вплоть до аспирантов. Ф. А. Новиков охватывает ряд направлений дискретной математики: теорию мно- жеств и алгебраические структуры, логику и булевы функции, причем затронута даже нетрадиционная проблема автоматического доказательства теорем, комби- наторику и кодирование. Особое внимание уделено общей теории графов — одно- му из важнейших инструментов программиста, и главным ее приложениям. Вся книга наполнена примерами конкретных алгоритмов от простых до достаточно сложных, особенно во второй половине книге. Это не только полезный учебный материал, но и багаж, который не окажется излишним в будущей практической деятельности учащихся. Книг подобной направленности и с подобным подбором материала в моем поле зрения почти не было. Книга снабжена списком русскоязычной литературы, из которой читатель смо- жет извлечь дополнительные сведения по заинтересовавшим его вопросам. Каж- дый источник из этого списка кратко охарактеризован в конце главы, к которой он относится. Содержание книги во всех ее разделах продуманно и конкретно. Решение автора не включать в книгу такие темы, как теория алгорифмов, надо считать правиль- ным — учебный курс не должен быть перегружен. Книга написана хорошим языком и, можно надеяться, будет благосклонно приня- та читателем и окажется для него хорошим подспорьем, в частности, при постро- ении математической модели возникшей перед человеком задачи и при выборе подходящего представления данных. Тому и другому автор уделяет неизменное внимание. Поучительно также краткое, но в большинстве случаев достаточно убедительное, обоснование правильности предлагаемых алгоритмов. Профессор, д.т.н., чл.-корр. РАН С. С. Лавров
Введение Назначение и особенности книги Данная книга представляет собой конспективный учебник по дискретной ма- тематике, включающий в себя описания важнейших алгоритмов над объектами дискретной математики. Учебник ориентирован на студентов программистских специальностей и практикующих программистов, которым по роду их занятий приходится иметь дело с конструированием и анализом нетривиальных алгорит- мов. В настоящее время имеется масса доступной литературы, покрывающей обе эти темы. С одной стороны, существуют десятки прекрасных книг по дискретной ма- тематике, начиная с элементарных учебников для начинающих и кончая исчер- пывающими справочниками для специалистов. С другой стороны, большое число монографий, многие из которых стали классическими, посвящены вопросам тео- рии и технологии программирования. Как правило, такие монографии содержат детальное описание и анализ важнейших и известнейших алгоритмов. Однако книги, которые бы рассматривали обе эти темы одновременно и во взаимосвязи, практически отсутствуют. В качестве редкого исключения можно назвать книгу В. Липского «Комбинаторика для программистов» [14], перевод которой выдер- жал уже два издания в России. Данный учебник принадлежит именно к такому жанру математической литературы, в котором математическое изложение дово- дится до уровня практически исполнимых программ. Он отличается большей широтой, но, пожалуй, меньшей глубиной охвата материала. Учебник основан на лекционном курсе, который автор уже в течение четырнадца- ти лет читает студентам кафедры «Прикладная математика» СаНкт-Петербург- ского государственного технического университета, что наложило определенный отпечаток на состав материала. Учебник охватывает почти все основные разделы дискретной математики: наив- ную теорию множеств, математическую логику, общую алгебру, комбинаторику и теорию графов. Из основных разделов отсутствуют теория алгоритмов и (ма- шинная) арифметика, равно как и некоторые необходимые для программиста, но более специальные разделы, такие как теория формальных грамматик, вычисли- тельная геометрия и теория конечных автоматов. Это объясняется тем, что дан- ные разделы студенты изучают в специальных курсах. В то же время в учебник
14 Введение включены такие специальные разделы, как теория булевых функций и теория кодирования, поскольку по этим темам специальных курсов не предусмотрено. В целом учебник преследует три основные цели. 1. Познакомить читателя с максимально широким кругом понятий дискретной математики. Количество определяемых и упоминаемых понятий и специаль- ных терминов намного превышает количество понятий, обсуждаемых более детально. Тем самым у студента формируется терминологический запас, не- обходимый для самостоятельного изучения специальной математической и теоретико-программистской литературы. 2. Сообщить читателю необходимые конкретные сведения из дискретной ма- тематики, предусматриваемые стандартной программой технических высших учебных заведений. Разбор доказательств приведенных утверждений и выпол- нение упражнений позволят студенту овладеть методами дискретной матема- тики, наиболее употребительными при решении практических задач. 3. Пополнить запас примеров нетривиальных алгоритмов. Изучение алгоритмов решения типовых задач дискретной математики и способов представления ма- тематических объектов в программах абсолютно необходимо практикующему программисту, поскольку позволяет уменьшить трудозатраты на «изобретение велосипеда» и существенно обогащает навыки конструирования алгоритмов. Структура книги Фактически весь материал делится на две части, соответствующие двум семе- страм курса. Первая часть, несколько большая по объему (главы 1-6), содержит самые общие сведения из различных разделов дискретной математики. Доля ал- горитмов в первой части несколько меньше, а доля определений несколько боль- ше, чем во второй части. Вторая часть (главы 7-12) целиком посвящена теории графов, поскольку связанные с ней вопросы (в частности, алгоритмы на графах) являются наиболее широко применяющимися в практическом программирова- нии разделами дискретной математики. Тексты алгоритмов на графах, некоторые из которых весьма нетривиальны, составляют почти половину объема материала второй части. Главы делятся, на разделы, которые, в свою очередь, делятся на подразделы. Ка- ждый раздел посвящен одному конкретному вопросу темы главы и по объему соответствует экзаменационному вопросу. Подразделы нужны для внутренних ссылок и более детальной структуризации материала. Как правило, в подразделе рассматривается какое-нибудь одно понятие, теорема или алгоритм. Главы книги более или менее независимы и могут изучаться в любом порядке, за исключением первых глав каждой части, которые содержат набор базисных определений для дальнейшего изложения.
Используемые обозначения 1 5 В конце каждой главы имеются два специальных раздела: «Комментарии» и «Упражнения». В разделах первого типа приводится очень краткий обзор ли- тературы по теме главы и даются ссылки на источники, содержащие более де-. тальиые описания упомянутых алгоритмов. Эти разделы не претендуют на статус исчерпывающего библиографического обзора, скорее это рекомендации для сту- дентов по чтению для самообразования. Упражнения немногочисленны — ровно по одному на каждый раздел — и очень просты. Как правило, в упражнения вы- носится дополнительный материал, непосредственно связанный с темой раздлаа (например, опущенные доказательства утверждений, аналогичных доказанным в основном тексте). Используемые обозначения Данная книга предназначена для программистов, то есть предполагается, что чи- татель не испытывает затруднений в понимании текстов программ на языке вы- сокого уровня. Именно поэтому в качестве нотации для записи алгоритмов ис- пользуется некоторый неспецифицированный язык программирования, похожий по синтаксису на Паскаль (но, конечно, Паскалем не являющийся). В программах широко используются математические обозначения, которые явля- ются самоочевидными в конкретном контексте. Например, конструкция for х е М do Р(х) end for означает применение процедуры Р ко всем элементам множества М. «Лишние» разделители систематически опускаются, функции могут возвращать несколько значений, и вообще, разрешаются любые вольности, которые позво- ляют сделать тексты программ более краткими и читабельными. Особого упоминания заслуживают два «естественных» оператора, аналоги кото- рых в явном виде редко встречаются в настоящих языках программирования. Оператор select т € М означает выбор произвольного элемента т из множества М. Этот оператор часто необходим в «переборных» алгоритмах. Оператор yield х означает возврат значения х, но при этом выполнение функции не прекращается, а продолжается со следующего оператора. Этот оператор позволяет очень просто записать «генерирующие» алгоритмы, результатом которых является некоторое заранее неизвестное множество значений. Поскольку данная книга написана на «программно-математическом» языке, в ней не только математические обозначения используются в программах, но и не- которые программистские обозначения используются в математическом тексте.
16 Введение Прежде всего, отметим широкое использование символа присвайвания : =, ко- торый в математическом контексте можно читать как «по определению» или «положим». Если в левой части такого присваивания стоит простая переменная, то это имеет очевидный смысл введения обозначения. Но в левой части может стоять и выражение. В этом случае левую часть следует понимать как заголовок процедуры вычисления значения выражения, а правую часть — как тело этой процедуры. Например, формула А = В:=Ас ВкВ С А означает следующее: «для того чтобы вычислить значение выражения А — В, нужно вычислить значения выражений А С В и В с А, а затем вычислить конъюнкцию этих значений». Наряду с обычным для математики «статическим» использованием знака : =, ко- гда выражению в левой части придается постоянное значение (определение кон- станты), знак присваивания используется и в «динамическом», программистском смысле. Например, пусть в графе G есть вершина v. Тогда формулу G: = G \ {v} следует понимать так: «удалим в графе G вершину w. Кроме того, в книге используются и другие приемы, хорошо известные програм- мистам. Например, описание структуры формул задается с помощью формальной грамматики в общепринятых обозначениях. Одной из задач книги является выработка у студентов навыка чтения математи- ческих текстов. Поэтому, начиная с самой первой страницы, интенсивно исполь- зуются без дополнительных объяснений язык исчисления предикатов и другие общепринятые математические обозначения. При этом стиль записи формул со- вершенно свободный и неформальный. Например, вместо формулы Vfc {(к < п) ==> Р(к)) может быть написано Vfc < п Р(к) в предположении, что читатель знает или догадается, какие синтаксические упро- щения используются. В первых главах книги основные утверждения (форму- лировки теорем) дублируются, то есть приводятся на естественном языке и на языке формул. Тем самым на примерах объясняется используемый язык формул. Но в последних частях книги и в доказательствах использование естественного языка сведено к минимуму. Это существенно сокращает объем текста, но требует внимания при чтении. В целом используемые обозначения строго следуют классическим образцам, при- нятым в учебной математической и программистской литературе. Непривычным может показаться только совместное использование этих обозначений в одном тексте. Но такое взаимопроникновение обозначений продиктовано основной за- дачей книги.
Выделения в тексте 17 Выделения в тексте В учебнике имеются следующие основные виды текстов: определения, теоремы, леммы и следствия, доказательства и обоснования, замечания, отступления, ал- горитмы и примеры. Фактически, обычный связующий текст сведен к минимуму в целях сокращения объема книги. Определения никак специально не выделяются, поскольку составляют львиную долю основного текста книги. Вместо этого курсивом выделяются определяющие вхождения терминов, а текст, соседствующий с термином, и есть определение. Все определяющие вхождения вынесены в алфавитный указатель, помещенный в конце книги. Таким образом, если при чтении попадается незнакомый термин, следует найти его определение с помощью указателя (или убедиться, что опре- деления в книге нет). Формулировки теорем, лемм и следствий, в соответствии с общепринятой в мате- матической литературе практикой, выделены курсивом. При этом формулиров- ке предшествует соответствующее ключевое слово: «теорема», «лемма», «следст- вие». Как правило, утверждения не нумеруются, за исключением случаев вхо- ждения нескольких однородных утверждений в один подраздел. Для ссылок на утверждения используются номера подразделов, в которых утверждения сфор- мулированы. Доказательства относятся к предшествующим утверждениям, а обоснования — к предшествующим алгоритмам. В очевидных случаях они опускаются или вы- носятся в упражнения. Доказательства и обоснования начинаются с соответству- ющего ключевого слова («доказательство» или «обоснование») и заканчиваются специальным значком □. Замечания и отступления также начинаются с соответствующего ключевого сло- ва: «замечание» или «отступление». Назначение этих абзацев различно. Замеча- ние сообщает некоторые специальные или дополнительные сведения, прямо от- носящиеся к основному материалу учебника. Отступление не связано непосред- ственно с основным материалом, его назначение — расширить кругозор читате- ля и показать связь основного материала с вопросами, лежащими за пределами курса. ЗАМЕЧАНИЕ........................................................ В очень редких случаях курсив используется не для выделения определяющих вхождений терминов и формулировок утверждений, а для того, чтрбы сделать эмфатическое ударение на каком-то слове в тексте. ________ ОТСТУПЛЕНИЕ ---------------------------------------------------- Использование отступлений необходимо, в противном случае у читателя может сложиться ошибочное впечатление о замкнутости изучаемого предмета и его оторванности от других областей знания.
18 Введение Алгоритмы, как уже было сказано, записаны на неспецифицированном языке программирования, синтаксис которого считается очевидным. Как правило, пе- ред текстом алгоритма на естественном языке указывается его назначение, а так- же входные и выходные данные. Ключевые слова в текстах алгоритмов выделя- ются полужирным шрифтом. Исполняемые операторы, как правило, комменти- руются, чтобы облегчить их понимание. Примеры, как правило, приводятся непосредственно вслед за определением по- нятия, поэтому не используется никаких связующих слов, поясняющих, к чему относятся примеры. В самих примерах интенсивно используются понятия, ко- торые должны быть известны читателю из курса математики средней школы, и понятия, уже рассмотренные в тексте книги. Благодарности Автор выражает благодарность своей жене Елене Владимировне Новиковой за постоянную поддержку в работе, коллеге Вадиму Эдуардовичу Халепскому за неоценимую помощь в оформлении рукописи и многочисленным студентам, про- слушавшим этот курс, за выявление ошибок в тексте. От издательства Ваши замечания, предложения, вопросы отправляйте по адресу электронной по- чты comp@piter-press.ru (издательство «Питер», компьютерная редакция). Мы будем рады узнать ваше мнение! Подробную информацию о наших книгах вы найдете на Web-сайте издательства http://www.piter-press.ru.
ГЛАВА 1 Множества и отношения В этой книге рассматриваются некоторые элементарные понятия «дискретной» или «конечной» математики, то есть математики, не связанной с понятиями бес- конечности, предела и непрерывности. Дискретная математика имеет широкий спектр приложений, прежде всего в областях, связанных с информационными технологиями и компьютерами. В самом первоначальном (ныне редко исполь- зуемом) названии комиьютера —.«электронная цифровая вычислительная ма- шина» — слово «цифровая» указывает на принципиально дискретный характер работы данного устройства. Понятия «множества», «отношения», «функции» и близкие к ним составляют основной словарь дискретной (равно как и классической «непрерывной») мате- матики. Именно эти базовые понятия рассматриваются в первой главе, заклады- вая необходимую основу для дальнейших построений. Отличие состоит в том, что здесь рассматриваются почти исключительно конечные множества, а тонкие и сложные вопросы, связанные с рассмотрением бесконечных множеств, созна- тельно опущены. С другой стороны, значительное внимание уделяется «предста- влению» множеств в программах. Эти вопросы не имеют никакого отношения к собственно теории множеств в ее классическом виде, но очень важны для прак- тикующего программиста. 1.1. Множества Человеческое мышление устроено так, что мир представляется состоящим из отдельных «объектов». Философам давно ясно, что мир — единое неразрывное целое, и выделение в нем объектов — это не более чем произвольный акт нашего мышления, позволяющий сформировать доступную для рационального анализа картину мира. Но как бы там ни было, выделение объектов и их совокупностей — естественный (или даже единственно возможный) способ организации нашего мышления, поэтому неудивительно, что он лежит в основе главного инструмента описания точного знания — математики.
20 , Глава 1. Множества и отношения 1.1.1. Элементы и множества Понятие множества принадлежит к числу фундаментальных неопределяемых по- нятий математики. Можно сказать, что множество — это любая определенная со- вокупность объектов. Объекты, из которых составлено множество, называются его элементами. Элементы множества различны и отличимы друг от друга. Пример Множество S страниц в данной книге. Множество N натуральных чисел 1, 2, 3, ... Множество Р простых чисел 2, 3, 5, 7, И, ... Множество Z целых чи- сел: ... , —2, —1, 0, 1, 2, ... Множество R вещественных чисел. Множество А различных символов на этой странице. Если объект х является элементом множества М, то говорят, что х принадле- жит М. Обозначение: х € М. В противном случае говорят, что х не принадле- жит М. Обозначение: х $ М. ЗАМЕЧАНИЕ------------------------------------------------------- Обычно множества обозначают прописными буквами латинского алфавита, а элементы множеств — строчными буквами. ОТСТУПЛЕНИЕ-------------------------------------------------------- Понятия множества, элемента и принадлежности, которые на первый взгляд предста- вляются интуитивно ясными, при ближайшем рассмотрении такую ясность утрачива- ют. Во-первых, проблематична отличимость элементов. Например, символы а и а, ко- торые встречаются на этой странице, — это один элемент множества А или два разных элемента? Во-вторых, проблематична возможность (без дополнительных усилий) ука- зать, принадлежит ли данный элемент данному множеству. Например, является ли число 86958476921537485067857467 простым? Множества, как объекты, могут быть элементами других множеств. Множество, элементами которого являются множества, обычно называется классом или се- мейством. ЗАМЕЧАНИЕ —--------—---------------------------------------------- Семейства множеств обычно обозначают прописными «рукописными» буквами латин- ского алфавита, чтобы отличить их от множеств, не содержащих множеств в качестве элементов. Множество, не содержащее элементов, называется пустым. Обозначение: 0. Обычно в конкретных рассуждениях элементы всех множеств берутся из неко- торого одного, достаточно широкого множества U (своего для каждого случая), которое называется универсальным множеством (или универсумом).
1.1. Множества 21 1.1.2. Задание множеств Чтобы задать множество, нужно указать, какие элементы ему принадлежат. Это можно сделать различными способами: перечислением элементов'. М: ={ai, а2,.. , at} характеристическим предикатом: М: = {я | Р(х)}; порождающей процедурой: М: — {а: [ х: = /}. ЗАМЕЧАНИЕ---------------------------------------------------------- При задании множеств перечислением обозначения элементов обычно заключают в фи- гурные скобки и разделяют запятыми. Характеристический предикат — это некоторое условие, выраженное в форме логического утверждения или процедуры, возвращающей логическое значение. Если для данного элемента условие выполнено, то он принадле- жит определяемому множеству, в противном случае — не принадлежит. Порождающая процедура — это процедура, которая, будучи запущенной, порождает некоторые объекты, являющиеся элементами определяемого множества. Пример 1. Мд: ={1,2,3,4,5,6,7,8,9}; 2. Мд : = {n|n€N&n< 10}; 3. Мд : = {п | for п from 1 to 9 yield тг}. ЗАМЕЧАНИЕ----------—-----—------;---------------------—- Множество целых чисел в диапазоне от т до п обозначают так: т..п. То есть т..п: --{к ё Z | 0 к & к п} . Перечислением можно задавать только конечные множества. Бесконечные множе- ства задаются характеристическим предикатом или порождающей процедурой. Пример N: = {п | п 0; while true п n + 1 do yield п endwhile} 1.1.3. Парадокс Рассела Задание множеств характеристическим предикатом может приводить к противо- речиям. Например, все рассмотренные в примерах множества не содержат себя в качестве элемента. Рассмотрим множество всех множеств, не содержащих себя в качестве элемента: Y = {X | X $ X}
22 Глава 1. Множества и отношения Если множество Y существует, то мы должны иметь возможность ответить на следующий вопрос: Y е У? Пусть Y е Y, тогда Y £ Y. Пусть Y £ Y, тогда у е Y. Получается неустранимое логическое противоречие, которое известно как парадокс Рассела. Вот три способа избежать этого парадокса. 1. Ограничить используемые характеристические предикаты видом Р(х) = х G A&Q(x)j где А — известное, заведомо существующее множество (универсум). Обычно при этом используют обозначение {х е А | <3(х)}. Для Y универсум не указан, а потому Y множеством не является. 2. Теория типов. Объекты имеют тип 0, множества имеют тип 1, множества мно- жеств — тип 2 и т. д. У не имеет типа и множеством не является. 3. Характеристический предикат Р(т) задан в виде вычислимой функции (алго- ритма). Способ вычисления значения предиката X € X не задан, а потому У множеством не является. ОТСТУПЛЕНИЕ —--------—---------------------------------------------— Последний из перечисленных способов лежит в основе так называемого конструктивиз- ма — направления в математике, в рамках которого рассматриваются только такие объ- екты, для которых известны процедуры (алгоритмы) их порождения. В конструктивной математике исключаются из рассмотрения некоторые понятия и методы классической математики, чреватые возможными парадоксами. 1.2. Операции над множествами Самого по себе понятия множества еще недостаточно — нужно определить спо- собы конструирования новых множеств из уже имеющихся, то есть операции над множествами. 1.2.1. Сравнение множеств Множество А содержится в множестве В (множество В включает множество А), если каждый элемент А есть элемент В: Ас В: = хе А=^~ хе В. В этом случае А называется подмножеством В, В — надмножеством А. Если А с В и А / В, то А называется собственным подмножеством В. Заметим, что V М М с М. По определению V М 0 с М. ЗАМЕЧАНИЕ-------------------------------------------------- Если требуется различать собственные и несобственные подмножества, то для обозначе- ния включения собственных подмножеств используется знак С, а для несобственных — С
1.2. Операции надмножествами 23 Два множества равны, если они являются подмножествами друг друга: А = В: = АсВ&Вс А. Мощность множества М обозначается как \М |. Для конечных множеств мощ- ность — это число элементов. Например, \0\ = 0, но |{0}| = 1. Если |А| — |В\, то множества АиВ называются равномощными. 1.2.2. Операции над множествами Обычно рассматриваются следующие операции над множествами: объединение: AU В: = {х | х е AV х 6 В}; пересечение-. АПВ: = {х | х е А&х е В}; разность: А\В: = {х\х € А&х £ В}: симметрическая разность: АДВ:=(АиВ)\(АПВ) = {ж | (х е А&х В) V (х А&х € В)}; дополнение: А: = {х | х А}. Операция дополнения подразумевает некоторый универсум U: А = U \ А. Пример Пусть А: ={1,2,3}, В: ={3,4,5}. Тогда AUB = {1,2,3,4,5}, АПВ = {3}, А\В = {1,2}' АДВ = {1,2,4,5} На рис. 1.1 приведены диаграммы Эйлера, иллюстрирующие операции над мно- жествами. Сами исходные множества изображаются фигурами (в Данном случае овалами), а результат графически выделяется (в данном случае для выделения использована штриховка). Операции пересечения и объединения допускают следующее обобщение. Пусть I — некоторое множество, элементы которого используются как индексы, и пусть для любого г е I множество At известно. Тогда |^А;: = {2;|Зге/2:е А»} , Q A;: = {а: | Vi е I х G А;}. ге/ ге/ 1.2.3. Разбиения и покрытия Пусть £ = {Ei}ieI — некоторое семейство подмножеств множества М, Et с М
24 Глава 1. Множества и отношения Рис. 1.1. Операции над множествами Семейство £ называется покрытием множества М, если каждый элемент М при- надлежит хотя бы одному из Ei. М c\^Ei <=>Vx &М Зг е I х е Ei. iei Семейство £ называется дизъюнктным, если элементы этого семейства попарно не пересекаются, то есть каждый элемент множества М принадлежит не более чем одному из множеств Ei. V i,j g I г j => Ei П Ej = 0. Дизъюнктное покрытие £ называется разбиением множества М. Пример Пусть М; ={1,2,3}. Тогда {{1,2}, {2,3}, {3,1}} является покрытием, но не разби- ением; {{1}, {2}, {3}} является разбиением (и покрытием), а семейство {{1}, {2}} является дизъюнктным, но не является ни покрытием, ни разбиением. 1.3. Алгебра подмножеств Операции над множествами обладают целым рядом важных свойств, которые рассматриваются в этом разделе.
1.3. Алгебра подмножеств 25 1.3.1. Булеан Множество всех подмножеств множества М называется булеаном и обозначает- ся 2м: 2м : = {А\Ас М} ТЕОРЕМА Для конечного множества М |2М| = 2lMl Доказательство Индукция по \М|. База: если |М| = 0, то М — 0 и 20 = {0}. Следовательно, |20| = |{0}| = 1 = 2° =-2l0L Индукционный переход: пусть V М |М| < к => |2М| = 2^м^. Рассмотрим М = = {аг,..., а*}, |М| = к. Положим Mi: = {X С 2м | ак 6 X} и М2 : = {X С 2м | ак £ X} . Имеем 2м = Mi U М2 и Mi О М2 = 0. По индукционному предположению |Mi| = 2fe-1, |М2| = 2fe-1. Следовательно, |2М| = |Mi| + |М21 = 2fe-1 + 2fe-1 = 2 • 2fc-1 = 2к = 2|JVf|. Пересечение, объединение и разность подмножеств множества U (универсума) являются подмножествами множества U. Множество всех подмножеств множе- ства U с операциями пересечения, объединения, разности и дополнения образует алгебру подмножеств множества U. 1.3.2. Свойства операций над множествами Пусть задан универсум U. Тогда V А, В, С с U выполняются следующие свойства. □ II 1. идемпотентность-. A U А = А, А А А = А; 2. коммутативность: AUB = BUA, А А В = В П А; 3. ассоциативность: AU(BUC) = (AUB)UC', АП(ВПС) = (АОВ)ПС'; 4. дистрибутивность: Аи(ВГ)С) = (A U В) A (A U С), А А (В U С) = (А А В) U (А А С); 5. поглощение: (А А В) U А = А, (A U В) А А = А; 6. свойства нуля: A U 0 = А, А А 0 = 0; 7. свойства единицы: A U U = U, ААВ = А; 8. инволютивность: А = А;
26 Глава 1. Множества и отношения 9. законы де Моргана: _____ _ _ ACVB = AUB, АОВ = А(~]В 10. свойства дополнения: Au3=J7, АпА = 0; 11. выражение для разности: А\В = АпВ. В справедливости перечисленных свойств можно убедиться различными спо- собами. Например, нарисовать диаграммы Эйлера для левой и правой частей равенства и убедиться, что они совпадают, или же провести формальное рас- суждение для каждого равенства. Рассмотрим для примера первое равенство: A U А = А. Возьмем произвольный элемент х, принадлежащий левой части ра- венства, х е АиА. По определению операции объединения U имеем х 6 AVz е А. В любом случае х е А. Взяв произвольный элемент из множества в левой части равенства, обнаружили, что он принадлежит множеству в правой части. Отсюда по определению включения множеств получаем, что A U А с А. Пусть теперь х € А. Тогда, очевидно, верно х е А V х е А. Отсюда по определению операции объединения имеем х € A U А. Таким образом, А с A U А. Следовательно, по определению равенства множеств, AUA — А. Аналогичные рассуждения нетруд- но провести и для остальных равенств. 1.4. Представление множеств в ЭВМ В этом параграфе рассматривается представление множеств в программах. Тер- мин «представление» (еще употребляют термин «реализация») применительно к программированию означает следующее. Задать представление какого-либо объ- екта (в данном случае множества) — значит описать в терминах используемой системы программирования структуру данных, используемую для хранения ин- формации о представляемом объекте, и алгоритмы над выбранными структура- ми данных, которые реализуют присущие данному объекту операции. В данной книге предполагается, что в используемой системе программирования доступны такие общеупотребительные структуры данных, как массивы, структуры (или записи) и указатели. Таким образом, применительно к множествам определение представления подразумевает описание способа хранения информации о принад- лежности элементов множеству и описание алгоритмов для вычисления объеди- нения, пересечения и других введенных операций. Следует подчеркнуть, что, как правило, один и тот же объект может быть пред- ставлен многими разными способами, причем нельзя указать способ, который является наилучшим для всех возможных случаев. В одних случаях выгодно использовать одно представление, а в других — другое. Выбор представления зависит от целого ряда факторов: особенностей представляемого объекта, соста- ва и относительной частоты использования операций в конкретной задаче и т. д. Умение выбрать наиболее подходящее для данного случая представление являет- ся основой искусства практического программирования. Хороший программист отличается тем, что он знает много разных способов представления и умело вы- бирает наиболее подходящий.
1.4. Представление множеств в ЭВМ 27 1.4.1. Реализация операций над подмножествами заданного универсума U Пусть универсум U — конечный, и число элементов в нем не превосходит раз- рядности ЭВМ: |{7| < п. Элементы универсума нумеруются: U = {их,... ,ип}. Подмножество А универсума U представляется кодом (машинным словом или битовой шкалой) С, в котором: {1. если щ е А, 0. если щ А, где С*[г] — это г-й разряд кода С. Код пересечения множеств Аи В есть поразрядное логическое произведение ко- да множества А и кода множества В. Код объединения множеств АиВ есть поразрядная логическая сумма кода множества А и кода множества В. Код до- полнения множества А есть инверсия кода множества А. В большинстве ЭВМ для этих операций есть соответствующие машинные команды. Таким образом, операции над небольшими множествами выполняются весьма эффективно. ЗАМЕЧАНИЕ ---------------------------------------- Если мощность универсума превосходит размер машинного слова, но не очень велика, то для представления множеств используются массивы битовых шкал. В этом случае операции над множествами реализуются с помощью циклов по элементам массива. 1.4.2. Генерация всех подмножеств универсума Во многих переборных алгоритмах требуется последовательно рассмотреть все подмножества заданного множества. В большинстве компьютеров целые числа представляются кодами в двоичной системе счисления, причем число 2к — 1 представляется кодом, содержащим к единиц. Таким образом, число 0 являет- ся представлением пустого множества 0, число 1 является представлением под- множества, состоящего из первого элемента, и т. д. Следующий тривиальный алгоритм перечисляет все подмножества n-элементного множества. Алгоритм 1.1. Алгоритм генерации всех подмножеств n-элементного множества Вход: п 0 — мощность множества Выход: последовательность кодов подмножеств i for г from 0 to 2n — 1 do yield i end for Обоснование Алгоритм выдает 2” различных целых чисел, следовательно, 2П различных кодов. С увеличением числа увеличивается количество двоичных разрядов, необходи- мых для его представления. Самое большое (из генерируемых) число 2П~Х требу- ет для своего представления ровно п разрядов. Таким образом, все подмножества генерируются, причем ровно по одному разу. □
28 Глава 1. Множества и отношения Недостаток этого алгоритма состоит в том, что порядок генерации подмножеств никак не связан с их составом. Например, вслед за подмножеством с кодом 0111 будет перечислено подмножество с кодом 1000. ОТСТУПЛЕНИЕ--------------------------------------------------------- Во многих переборных задачах требуется рассмотреть все подмножества некоторого мно- жества и найти среди них то, которое удовлетворяет заданному условию. При этом про- верка условия часто может быть весьма трудоемкой и зависеть от состава-элементов оче- редного рассматриваемого подмножества. В частности, если очередное рассматриваемое подмножество незначительно отличается по набору элементов от предыдущего, то ино- гда можно воспользоваться результатами оценки элементов, которые рассматривались на предыдущем шаге перебора. В таком случае, если перебирать множества в определенном порядке, можно значительно ускорить работу переборного алгоритма. 1.4.3. Алгоритм построения бинарного кода Грея Данный алгоритм генерирует последовательность всех подмножеств п-элемент- ного множества, причем каждое следующее подмножество получается из преды- дущего удалением или добавлением одного элемента. Алгоритм 1.2. Алгоритм построения бинарного кода Грея Вход: п > 0 — мощность множества Выход: последовательность кодов подмножеств В В : array [l..n] of 0..1 { битовая шкала для представления подмножеств } for г from 1 to п do В [г]: = 0 { инициализация } end for yield В { пустое множество } for i from 1 to 2n — 1 do p: = Q(i) { определение элемента, подлежащего добавлению или удалению } В[р]: = 1 — В[р] { добавление или удаление элемента } yield В { очередное подмножество } end for proc Q(i) { количество 2 в разложении г на множители + 1 } q: = l; j:=i while j четно do j:=j/2; q:=q + l end while return q end proc Обоснование Для n = 1 искомая последовательность кодов суть 0,1. Пусть есть искомая по- следовательность кодов Bi,..., В2к для п = к. Тогда последовательность кодов В10,..., В2к0, В2к 1,... ,Bil будет искомой последовательностью для п = к + 1. Действительно, в последовательности В±0,... ,В2кО, В2к1,... имеется 2fc+1
.4. Представление множеств в ЭВМ 29 кодов, они все различны и соседние различаются ровно в одном разряде по по- строению. Именно такое построение и осуществляет данный алгоритм. На ну- левом шаге алгоритм выдает правильное подмножество В (пустое). Пусть за первые 2к — 1 шагов алгоритм выдал последовательность значений В. При этом В[к + 1] = В[к + 2] = • • • = В[п] = 0. На 2к-м шаге разряд В[к + 1] изменяет свое значение с 0 на 1. После этого будет повторена последовательность изме- нений значений В[1../г] в обратном порядке, поскольку Q(2k + zn) = Q(2k — m) для 0 < m < 2fc - 1. □ Пример Протокол выполнения алгоритма 2 для п = 3. i Р В ООО 1 1 0 0 1 2 2 0 1 1 3 1 0 1 0 4 3 1 1 0 5 1 1 1 1 6 2 1 0 1 7 1 10 0 1.4.4. Представление множеств упорядоченными списками Если универсум очень велик (или бесконечен), а рассматриваемые подмноже- ства универсума не очень велики, то представление с помощью битовых шкал не является эффективным с точки зрения экономии памяти. В этом случае мно- жества обычно представляются списками элементов. Элемент списка при этом представляется записью с двумя полями: информационным и указателем на сле- дующий элемент. Весь список представляется указателем на первый элемент. elem = record i: info; { информационное поле } п: f elem { указатель на следующий элемент } end record При таком представлении трудоемкость операции е составит О(п), а трудоем- кость операций с, П, U составит О{пт), где пит — мощности участвующих в операции множеств. Если элементы в списках упорядочить, например, по возрастанию значения по- ля г, то трудоемкость всех операций составит О(п). Эффективная реализация операций над множествами, представленными в виде упорядоченных списков, основана на весьма общем алгоритме, известном как алгоритм типа слияния.
30 Глава 1. Множества и отношения Алгоритм типа слияния параллельно Просматривает два множества, представлен- ных упорядоченными списками, причем на каждом шаге продвижение происхо- дит в том множестве, в котором текущий элемент меньше. 1.4.5. Проверка включения слиянием Рассмотрим алгоритм типа слияния, который определяет, является ли множе- ство А подмножеством множества В. Алгоритм 1.3. Проверка включения слиянием Вход: проверяемые множества А и В, которые заданы указателями а и Ь. Выход: 1, если А С В, в противном случае 0. ра: — a;pb: = Ь while ра 7^ nil & pb / nil do if pa.i < pb.i then return 0 { элемент множества А отсутствует в множестве В } else if pa.i > pb.i then pb: = pb.n { элемент множества А, может быть, присутствует в множестве В } else ра: —ра.п { здесь pa.i = pb.i, то есть } pb: = pb.n { элемент множества А точнб присутствует в множестве В } end if end while return pa — nil Обоснование На каждом шаге основного цикла возможна одна из трех ситуаций: текущий эле- мент множества А меньше, больше или равен текущему элементу множества В. В первом случае текущий элемент множества А заведомо меньше, чем текущий и все последующие элементы множества В, а потому он не содержится в множе- стве В, и можно завершить выполнение алгоритма. Во втором случае происходит продвижение по множеству В в надежде отыскать элемент, совпадающий с теку- щим элементом множества А. В третьем случае найдены совпадающие элементы, и происходит продвижение сразу в обоих множествах. По завершении основно- го цикла возможны два случая: либо ра = nil, либо ра / nil. Первый случай означает, что для всех элементов множества А удалось найти совпадающие эле- менты в множестве В. Второй случай означает, что множество В закончилось раньше, то есть не для всех элементов множества А удалось найти совпадающие элементы в множестве В. □ 1.4.6. Вычисление объединения слиянием Рассмотрим алгоритм типа слияния, который вычисляет объединение двух мно- жеств, представленных упорядоченными списками.
1.4. Представление множеств в ЭВМ 31 Алгоритм 1.4. Вычисление объединения слиянием Вход: объединяемые множества А и В, которые заданы указателями а и Ь. Выход: объединение С = A U В, заданное указателем с. ра: = a; pb: = 6; с: =nil; е: =nil while ра /nil & pb /nil do if pa.i < pb.i then d: = pa.i-, pa -.=pa.n { добавлению подлежит элемент множества А } else if pa.i > pb.i then d: =pb.i;pb: — pb.n { добавлению подлежит элемент множества В } else d: = pa.i { здесь pa.i = pb.i, и можно взять любой из элементов } ра: = ра.п; pb: = pb.n end if Append(c, е, d){ добавление элемента d в конец списка с } end while р: =nil if ра /nil then p:=pa { нужно добавить в результат оставшиеся элементы множества А } end if if pb /nil then p: = pb { нужно добавить в результат оставшиеся элементы множества В } encTif while р /nil do Append(c, е,р.г) p: — р.п end while Обоснование На каждом шаге основного цикла возможна одна из трех ситуаций: текущий эле- мент множества А меньше, больше или равен текущему элементу множества В. В первом случае в результирующий список добавляется текущий элемент мно- жества А и происходит продвижение в этом множестве, во втором аналогичная операция производится с множеством В, а в третьем случае найдены совпада- ющие элементы и происходит продвижение сразу в обоих множествах. Таким образом, в результат попадают все элементы обоих множеств, причем совпадаю- щие элементы попадают ровно один раз. По завершении основного цикла один из указателей ра и pb (но не оба вместе!) может быть не равен nil. В этом случае остаток соответствующего множества без проверки добавляется в результат. □ Вспомогательная процедура Append(c, е, d) присоединяет элемент d к хвосту е списка с. Алгоритм 1.5. Процедура Append — присоединение элемента в конец списка Вход: указатель с на первый элемент списка, указатель е на последний элемент списка, добавляемый элемент d. Выход: указатель с на первый элемент списка, указатель е на последний элемент списка. q: = new(elem); q.i: = d; q.n: =nil { новый элемент списка }
32 Глава 1. Множества и отношения if с =nil then c:-q else e.n: = q end if e: = q Обоснование До первого вызова функции Append имеем: с = nil и е = nil. После первого вы- зова указатель с указывает на первый элемент списка, а указатель е — на послед- ний элемент (который после первого вызова является тем же самым элементом). Если указатели с и е не пусты и указывают на первый и последний элементы правильного списка, то после очередного вызова функции Append это свойство сохраняется, поскольку из текста основной программы видно, что, кроме иници- ализации, все остальные манипуляции с этими указателями выполняются только с помощью функции Append. □ 1.4.7. Вычисление пересечения слиянием Рассмотрим алгоритм типа слияния, который вычисляет пересечение двух мно- жеств, представленных упорядоченными списками. Алгоритм 1.6. Вычисление пересечения слиянием Вход: пересекаемые множества А и В, заданные указателями а и Ь. Выход: пересечение С = А П В, заданное указателем с. pa: = а; pb: = Ь; с: = nil; е: =nil while pa /nil &j>b /nil do if pa.i < pb.i then .pa: =pa.n { элемент множества А не принадлежит пересечению } else if pa.i > pb.i then pb:=pb.n { элемент множества В не принадлежит пересечению } else { здесь pa.i = pb.i — данный элемент принадлежит пересечению } Append(c, e,pa.i);pa: = pa.n;pb: = pb.n end if end while Обоснование На каждом шаге основного цикла возможна одна из трех ситуаций: текущий эле- мент, множества А меньше, больше или равен текущему элементу множества В. В первом случае текущий элемент множества А не принадлежит пересечению, он пропускается и происходит продвижение в этом множестве, во втором то же самое производится с множеством В. В третьем случае найдены совпадающие элементы, один экземпляр элемента добавляется в результат и происходит прр- движение сразу в обоих множествах. Таким образом, в результат попадают все совпадающие элементы обоих множеств, причем ровно один раз. □
1.5. Отношения 33 1.5. Отношения Обычное широко используемое понятие «отношения» имеет вполне точное ма- тематическое значение, которое вводится в этом разделе. 1.5.1. Упорядоченные пары Если а и b — объекты, то через (а, 6) обозначим упорядоченную пару. Равенство упорядоченных пар определяется следующим образом: (a, b) = (с,d): = а = с&b = d. Вообще говоря, (а,Ь) / (Ь, а). ЗАМЕЧАНИЕ ——.................................................. Упорядоченные пары можно рассматривать как множества, если определить их так: (а, Ь) :={а, {а, Ь}}. Таким образом, понятие упорядоченной пары не выводит рассмотрение за пределы теории множеств, но независимое определение технически удобнее. 1.5.2. Прямое произведение множеств Пусть А и В — два множества. Прямым (декартовым) произведением двух мно- жеств А и В называется множество упорядоченных пар, в котором первый эле- мент каждой пары принадлежит А, а второй принадлежит В: А х В : = {(а, Ь) | а 6 А&Ье В} . ЗАМЕЧАНИЕ------------------------------------------------------- Точка на плоскости может быть задана упорядоченной парой координат, то есть двумя точками на координатных осях. Таким образом, R2 = R х R. Метод координат ввел в употребление Рене Декарт (1596-1650), отсюда и название «декартово произведение». Степенью множества А называется его прямое произведение самого на себя. Обо- значение: Ап: = А х • • х А . п раз Соответственно, А1: = А, А2: = А х А и вообще Ап : = А х Д’1-1. ТЕОРЕМА |Д х В| = |Л| |В|- Доказательство Первый компонент упорядоченной пары можно выбрать |А| способами, второй — |В| способами. Таким образом, всего имеется |А||-®1 различных упорядоченных пар. □
34 Глава 1. Множества и отношения СЛЕДСТВИЕ | Ап{ = |Л|П. 1.5.3. Отношения Пусть А и В — два множества. (Бинарным) отношением R из множества А в множество В называется подмножество прямого произведения А и В: R С А х В. Для бинарных отношений обычно используется инфиксная форма записи: aRb: =(а, Ь) G R С А х В. Если А = В, то говорят, что R есть отношение на множестве А. Пример Пусть задан универсум U. Тогда G (принадлежность) — отношение из множества U в множество 2е7, а С (включение) и = (равенство) — отношения на 2е7. Хорошо известны отношения =, <, <, >, /, определенные на множестве чисел. Пусть R есть отношение на A: R С А х А, а, b € А. Введем следующие понятия: Обратное отношение: Л-1: = {(а, Ь) | (Ъ, а) G R}. Дополнение отношения: R: == {(а, Ь) | (а, 6) J?}. Тождественное отношение: I: = {(а, а) | a G А}. Универсальное отношение: U: = {(а, Ь) | a G А &; b G А}. Введем обобщенное понятие отношения: п-местное (п-арное) отношение R - это множество упорядоченных наборов (кортежей): R С Л1 х • • • х Дп = {(oi, az,..., ап) | ai G Ах &... & ап G Ап). Множества А, не обязательно различны. ОТСТУПЛЕНИЕ-------------------------------------------------------- Многоместные отношения используются, например, в теории баз данных. Само названи «реляционная» база данных происходит от слова relation (отношение). Далее рассматриваются только двуместные (бинарные) отношения, при этом ело во «бинарные» опускается. 1.5.4. Композиция отношений Пусть Rx С А х С — отношение изАвС, а^сСхВ - отношение из С в L Композицией двух отношений Rx и J?2 называется отношение- R с А х В из А В, определяемое следующим образом: Я: = В1 о й2 : = {(а,6) | a G А & Ь G В& 3 с 6 С aRxC&cRzb) . Композиция отношений на множестве А является отношением на множестве .
1.5. Отношения 35 1.5.5. Степень отношения Пусть R — отношение на множестве А. Степенью отношения R на множестве А называется его композиция с самим собой. Обозначение: йп: = Яо...ой. п раз Соответственно, R°: = I, R1: = R, R2 : = R о R и вообще _Rn: = Rn~1 о R. ТЕОРЕМА Если некоторая пара (а,Ь) принадлежит какой-либо степени отно- шения R на множестве А мощности п, то эта пара принадлежит и степени R не выше п — 1: R С А2& |А| = п => (Va,b G A 3k aRkb =>3k<n aRkb). Доказательство Существование требуемой степени к отношения R обеспечивается следующим построением. while к п do со: = a; Ct: = Ь (а,Ь) G Rk => 3ci,...,Cfc_i G A coRc^Ra^R...Rck-iRck |A| = n => 3i, j = Cj => cqRciR. .. RciRcj+1R... Rck-^RCk =* => (a,b) G Rk-^-^ k-. = k-(j-i) end while □ СЛЕДСТВИЕ R C A2& |A| = n =» |J = J R\ i=l i=l 1.5.6. Ядро отношения Если R с A x В — отношение из А в В, то RoR-1 называется ядром отношения R. Ядро отношения R из А в В является отношением на А. Пример Пусть задано множество М, |М| = п. Рассмотрим отношение Р из булеана 2м в множество целых чисел О..п = {0,1,..., п}, ЙС2мхО.л, где Р: = {(X, к) | X С М& к G О..п& |Х| = к}. Тогда ядром отношения Р являет- ся отношение равномощности.
36 Глава 1. Множества и отношения 1.5.7. Свойства отношений Пусть R С А2. Тогда отношение й называется рефлексивным, антирефлексивным, симметричным, антисимметричным, транзитивным, полным, или линейным, если V a G A aRa; если V a G A ~^aRa; если V a, b € A aRb => bRa; если Va,b G A aRb & bRa => a = b; если Va,b,c € A aRb&bRc => aRa, если V a,b g A a/b => aRb V bRa. ТЕОРЕМА Пусть R с Ax A — отношение на А. Тогда: 1. R рефлексивно 2. R симметрично 3. R транзитивно 4. R антисимметрично 5. R антирефлексивно 6. R полно <=> I cR; <=>R = R-1; <=> й о й с Й; <=>йпй-1 cl; <=> й ПI = 0; <=> йиIUЙ-1 == [7. Доказательство Используя определения свойств отношений, имеем: 1. =>: V a G A aRa => V a G А (а, а) G й ==> I С R. 1. 4=: / С й => 'i a (a, a) G й => V a aRa. 2. =>: (У a,b G A aRb => bRa) ==> (Va,b G A (a,b) G Й => (b,a) G й), ((a,b) eR=(b,a)e й'1) => (й c R^kR'1 cR)=^R= Й"1. 2. <=: й = Й-1 ==> Va,b G A ((a,b) G Й => (a, b) G й~1&(а,Ь) G Й-1 =* => (a, b) G R), ((a, b) G Й = (6, a) G Й-1) => ((a, b) G Й =» (b, a) G R) ==> (Va, b G A aRb ==> bRa). 3. =>: Va, b,c aRb&bRc =» aRc; aR о Rb = 3 c G A aRc&cRb ==» => aRb => й о й С Й. 3. Ф=: й о й С Й ==> (Va, b G A (a,b) G Ro R => (a, b) G й)=Ф- ==> (айс& cRb => aRb). 4. =>: От противного, й П й-1 I =» 3а / b aRb&aR^b ==> => 3 a / b aRb & bRa, 4. 4==:' ЙПЙ"1 С I ==> (айЬ&ай~1Ь ==> a = b) => (айЬ&Ьйа ==> a = b). 5. ==>: От противного. RCiI / 0 ==> (За G A aRak.ala) = (3a G A aRa) = = -iV a G A -<aRa. 5. <=: й ЛI = 0 => ->3 a G A aRa => Va G A ~>aRa.
1.5. Отношения 6. =>: (Уa,b G А а b => aRbVbRa) => (а b => (а,b) G RUR 1),(а = Ь=ф. ==> (а,Ь) еГ)=> (Va,be A (a,b) € EUIUfi"1) => U С ЛиГий"1 => =>U = RUHJR-1. 6. <=: Ли/иЯ 1 = {7 => (а = Ь&(а,Ь) е IVa/Ь&(а,Ь) G ЯиЛ x)=> => (а = Ь&(а,Ь) elV(a^b==> (a,b) eRV(a,b) е R'1)) => => (а / b => aRb V bRa). □ 1.5.8. Представление отношений в ЭВМ Пусть R С А2 и |А| = п. Перенумеруем элементы множества А. Тогда отношение R можно представить матрицей R : array [l..n,l..n] of 0..1, где 1, если iRj, _________ О,. если iRj. Матрица отношения R обозначается | R |. ТЕОРЕМА Rx о R2 = Ях х Я2 , где Доказательство Пусть (а, Ь) е Ri ° R2. Тогда Все A aRxC^cR2b Я1 [а, с] = 1 & R2 [с, Ь] = 1 Ri и, следовательно, Пусть теперь (а, Ь) Ях о й2. х R2 Тогда -13с е A aRic&cR^b => Vc е A -^{aRiciccRob') => Vc G A -,aRic V ->cR2b =» Vc е A R± [a,c] = 0V /?2 [с,Ь] = О VcgA 1 О .*:=! и, следовательно, х R2 □ --П ।---ik СЛЕДСТВИЕ I Яь I = |Я| ТЕОРЕМА
38 Глава 1. Множества и отношения Доказательство Пусть (а, Ь) G .Ri U J?2- Тогда aR±b V aR2b ==> =Ф ( .Ri V Я2 ) [а,В] Пусть теперь (а, Ь) Ri U R2. Тогда ->aRib& ~^aR2b Ri [а, В] = I V J?2 [а, Ь] — 1 J?x [а, Ь] = 0 & R2 [а, 6] = О J?i [djb} V R2 [а, В] 1.6. Функции Понятие «функции» является одним из основополагающих в математике. В дан- ном случае подразумеваются прежде всего функции, отображающие одно конеч- ное множество объектов в другое конечное множество. Мы избегаем использо- вания термина «отображение» и предпочитаем слово «функция» в расчете на постоянное сопоставление читателем математического понятия функции с поня- тием функции в языках программирования. 1.6.1. Определения Пусть f —- отношение из А в В, такое что Va (a, b) G f &(a, c) G f ==> b = c. Такое свойство отношения называется однозначностью, или функциональностью, а само отношение называется функцией из А в В и обозначается следующим образом: f: А -> В или А В. Если f: А -> В, то обычно используется префиксная форма записи: Ь = /(а):=(«»Ь)е/. Если b = /(а), то а называют аргументом, зЬ — значением функции. ЗАМЕЧАНИЕ-------------------—------------ — -------------------- Вообще, всякому отношению R из А в В (R С А х В) можно сопоставить (тотальную) функцию R-. А х В —> 0..1 (эта функция называется характеристической функцией от- ношения), полагая 1, если aRb, О, если aRb. R(a,b): =
1.6. Функции 39 Пусть /: А -» В, тогда область определения функции: /д: = {аеА|ЗЬёВЬ = /(а)}; область значений функции: /в : = {Ь 6 В | За е А Ь = /(а)}. Если /д = А, то функция называется тотальной, а если /д / А — частичной. Сужением функции /: А -> В на множество М С А называется функция f\M, определяемая следующим образом: Лм: = {(а,Ь) | (a,b) е fka е М} • Для тотальной функции f = f\fA. Функция /: Л1 х • • • х Ап -> В называется функцией п аргументов, или п-мест- ной функцией. 1.6.2. Инъекция, сюръекция и биекция Пусть f: А -> В. Тогда функция f называется: инъективной, если Ь = f(ai)kb = /(аг) => ах = аг; сюръективной, если Vb е В За е А Ь = /(а); биективной, если она инъективная и сюръективная. ЗАМЕЧАНИЕ-------------------------------------------------------------- Биективную функцию также называют взаимнооднозначной. Рис. 1.2 иллюстрирует понятия отношения, функции, инъекции, сюръекции и биекции. ТЕОРЕМА Если f: А -> В — тотальная биекция (fA = А), то отношение f~* с В х А (обратная функция) является биекцией. Доказательство Поскольку f — биекция, имеем (Ьх = /(а) & Ь2 = /(а) ==> &х = &г) & &(Ь = /(ах) = /(а2) => ах = а2) &(Vb е В За 6 A b — Покажем, что /-1 — функция. | а 6 Akb 6 В kb = /(а)}. Пусть ах = /-1(Ь)&а2 = /-1(Ь). Тогда b = f(a()kb = /(а2) => аг = а2. Покажем, что /-1 — инъекция. Пусть а = /-1(Ьх)&а = /-1(Ь2)- Тогда bi = = f(a)kb2 = /(а) ==> Ьх = Ь2. Покажем от противного, что /-1 — сюръекция. Пусть За е А -пЗЬ е В а = /-1(Ь). Тогда За е АЧЬ е В а ± /-1(Ь). Обозначим этот элемент а0. Имеем Vb а0 /-1(Ь) => Vb b / /(ао) ==> а0 /д С А => г o,q А. □
Глава 1. Множества и отношения Отношение, но не функция Инъекция, но не сюръекция Сюръекция, но не инъекция Рис. 1.2. Различные виды функций 1.6.3. Индуцированная функция Пусть f: А -» В и пусть Ах с A, Bi С В. Тогда множество F(A1): = {bGB|3aGA1 b f(a)} образом множества Ах, а множество : = {a G А | ЗЬ G Вх Ь = /(а)} юобразом множества Вх- Заметим, что F является отношением из Л в множество 2^в: F: = {(Ах, Bi) | Ах С А & Вх С В & Вх = В(Ах)} ТЕОРЕМА Если f : А -> В тоже функции. функция, то F: 2?А -> 2^в и F 1 2!в -> 2sА — ЗАМЕЧАНИЕ---------------------------------------------- F называется индуцированной функцией, a F~l — переходом к прообразам
1.7. Отношения эквивалентности 41 1.6.4. Представление функций в ЭВМ Пусть f : А -» В, множество А конечно и не очень велико, |А| = п. Наибо- лее общим представлением такой функции является массив array [A] of В, где А — тип данных, значения которого представляют элементы множества А, а В — тип данных, значения которого представляют элементы множества В. Если сре- да программирования допускает массивы только с натуральными индексами, то элементы множества А нумеруются (то есть А = {ai,... ,an}) и функция пред- ставляется с помощью массива array [l..n] of В. Функция нескольких аргументов представляется многомерным массивом. ОТСТУПЛЕНИЕ-------------------------------------------------- Представление функции с помощью массива является эффективным по времени, посколь- ку реализация массивов в большинстве случаев обеспечивает получение значения за по- стоянное время, не зависящее от размера массива и значения индекса. Если множество А велико или бесконечно, то использование массивов для пред- ставления функций является неэффективным с точки зрения экономии памяти. В таком случае для представления функций используется особый вид проце- дур, возвращающих единственное значение для заданного значения аргумента. Обычно такие процедуры также называются «функциями». В некоторых языках программирования определения функций вводятся ключевым словом function. Многоместные функции представляются с помощью нескольких формальных па- раметров в определении функции. Свойство функциональности обеспечивает- ся оператором возврата, часто обозначаемым ключевым словом return, который прекращает выполнение тела функции и одновременно возвращает значение. ОТСТУПЛЕНИЕ------------------------------------------------- В языке программирования Фортран и некоторых других языках вызов функции и обра- щение к массиву синтаксически неотличимы, что подчеркивает родственность этих поня- тий. 1.7. Отношения эквивалентности Различные встречающиеся на практике отношения могут обладать (или не обла- дать) теми или иными свойствами. Свойства, введенные в подразделе 1.5.7, встре- чаются особенно часто (потому им и даны специальные названия). Более того, оказывается, что некоторые устойчивые комбинации этих свойств встречаются настолько часто, что заслуживают отдельного названия и специального изучения. Здесь рассматриваются классы отношений, обладающих определенным набором свойств. Такое «абстрактное» изучение классов отношений обладает тем преиму- ществом, что один раз установив некоторые следствия из наличия у отношения определенного набора свойств, далее эти следствия можно автоматически рас- пространить на все конкретные отношения, которые обладают данным набором свойств. Рассмотрение начинается отношениями эквивалентности (в этом разде- ле) и продолжается отношениями порядка (в следующем разделе).
42 Глава 1. Множества и отношения 1.7.1. Определения Рефлексивное симметричное транзитивное отношение называется отношением эквивалентности. Обычно отношение эквивалентности обозначают знаком =. Пример Отношения равенства чисел и множеств являются отношениями эквивалентно- сти. Отношение равномощности множеств также является отношением эквива- лентности. Другие, более интересные примеры отношений эквивалентности при- ведены в последующих главах книги. 1.7.2. Классы эквивалентности Пусть = — отношение эквивалентности на множестве М и х € М. Подмножество элементов множества М, эквивалентных х, называется классом эквивалентности ДЛЯ X'. И {у\у еМ&у = х} Если отношение подразумевается, то индекс = обычно опускают. ЛЕММА 1 VaeM [a] / 0. Доказательство ЛЕММА 2 а = b => [а] = [Ь]. Доказательство Пусть а = Ь. Тогда х € [а] => х = а & а = b => х = Ь => х € [ft]; х € [ft] => х = Ь => х = b & а = b ==> х = b & Ь = а => х = а => х € [а]. ЛЕММА 3 а Ъ ==> [а] О [ft] = 0. Доказательство От противного: [а] П [ft] / 0 => 3 с е [а] П [ft] ==> с е [а] & с € [ft] => □ с — а & с = ft => а = с & с = ft ==Ф- а = Ь.
4.7. Отношения экаивалентности 43 ТЕОРЕМА Всякое отношение эквивалентности на множестве М определяет раз- биение множества М, причем среди элементов разбиения нет пустых; и обратно, всякое разбиение множества М, не содержащее пустых элементов, определяет отношение эквивалентности на множестве М: =С М2 = Bi cMkBi^0kM = i? j => =*. Bi nBj = 0. Доказательство Необходимость Построение требуемого разбиения обеспечивается следующим алгоритмом. Вход: множество М, отношение эквивалентности = на М. Выход: разбиение ® множества М. U-. = M;%-. = 0 while U / 0 do select a е U { возьмем любой элемент из М } А: = Eq(a, М, =) { построим его класс эквивалентности } U: = U \ А { удалим класс из множества } В: = ® U {А} { и добавим в разбиение } end while Функция Eq обеспечивает построение класса эквивалентности: Вход: элемент а из множества М, отношение эквивалентности = на М. Выход: последовательность элементов, образующих класс эквивалентности А. for 6 е М do if b = a then yield b end if end for return A Достаточность. Положим a = b: — Bi a € Bi&:b e Bt. Тогда 1. рефлексивность: M = UBj => Va e M Bi a € Bi, a € Bi r* a € Bi & a € Bi 111 a = a; 2. симметричность: a = b ==> Bi a e Bi&b e Bi => Bi b € Bi&,a e Bi => b = a; 3. транзитивность: a = b & b = c => [a] = [b] &[b] = [c] => [a] = [с] => a = с. E 1.7.3. Фактормножества Если R — отношение эквивалентности на множестве М, то множество классш эквивалентности называется фактормножеством множества М по эквивалент ности R и обозначается M/R-. •^/^:={Ин}хелт
Глава 1. Множества и отношения Фактормножество является подмножеством булеана: M/Rc 2м. Функция nat R: М -> М/R называется отождествлением и определяется следу- ющим образом: nat R{x): =[а:)в. 1.7.4. Ядро функции Всякая функция, будучи отношением, имеет ядро. Ядро функции f обозначается кег /: кег/:=/о/-1 ТЕОРЕМА Ядро функции является отношением эквивалентности на области определения функции. Доказательство Пусть f: А —> В. Не ограничивая общности, можно считать, что /а = А и /в = В. Тогда Vb е В Ba е A b = J(a)kVa eABbeBb = f(a), кег/ = {(ai,a2) | аг, а2 € А к 2 b b = /(ai)&a2 € /-1(Ь)}- Рефлексивность. Пусть а е А. Тогда 2 b е В b= f(a) => а € /-1(Ь) => (о, b) € / &(b, a) € /-1 ==> => (a, a) 6 /,°/-1. Симметричность. Пусть (ai,a2) е / °/-1. Тогда Bb b = /(ai) &a2 е f-\b) => й1 е f-\b) kb = /(а2) => fe = /(а2)&ах e /-1(Ь) ==> (a2,ai) € /о/"1. Транзитивность. Пусть (ai,a2) € / ° /~! и (a2,a3) € / ° /~г, Это означает, что 2t>i G В bi = /(ai) ka2 6 / 1(bi) и 2b2 € В b2 — /(a2)ka^ € / 1(b2). Тогда bi = /(aj&bi = /(a2)&b2 - /(a2)&b2 = /(a3) => bi = b2. Положим b: = bi (или b:=b2). Тогда b = /(aj&b = => b = /(ai)&a3 e /-1(b) => ==► (ai,a3) €/о/”1. □ Пример Мощность множества является функцией из множества конечных множеств в множество неотрицательных целых чисел. Ядро этой функции — это отношение равномощности, которое является, таким образом, отношением эквивалентности. 1.8. Отношения порядка В этом разделе определяются различные варианты отношений порядка. Отно- шение порядка позволяет сравнивать между собой различные элементы одно- го множества. Фактически, интуитивные представления об отношениях порядка
1.8. Отношения порядка 45 уже были использованы при описании работы с упорядоченными списками в подразделах 1.4.4-1.4.7. Здесь вводятся точные определения, которые предпола- гаются известными в остальной части книги. 1.8.1. Определения Антисимметричное транзитивное отношение называется отношением порядка. Отношение порядка может быть рефлексивным, и тогда оно называется отноше- нием нестрогого порядка. Отношение порядка может быть антирефлексивным, и тогда оно называется отношением строгого порядка. Отношение порядка мо- жет быть полным (линейным), и тогда оно называется отношением полного, или линейного порядка. Отношение порядка может не обладать свойством полноты (линейности), и тогда оно называется отношением частичного порядка. Обычно отношение строгого порядка (полного или частичного) обозначается знаком <, а отношение нестрогого порядка — знаком Отношение порядка в общем случае обозначается знаком ЗАМЕЧАНИЕ-------------------------------------------------------- Для строгого порядка свойство антисимметричности можно определить следующим обра- зом: Va, b а < b =$ ->(Ь < а). Пример Отношение < на множестве чисел является отношением строгого полного поряд- ка. Отношение на множестве чисел является отношением нестрогого полного порядка. Отношение С на булеане 2м является отношением нестрогого частич- ного порядка. Множество, на котором определено отношение частичного порядка, называется частично упорядоченным. Множество, на котором определено отношение полного порядка, называется вполне упорядоченным. Пример Множество чисел упорядочено линейно, а булеан упорядочен частично. 1.8.2. Минимальные элементы Элемент х множества М с отношением порядка -< называется минимальным, если не существует меньших элементов: -Gy е М у -< х&у х. Пример Пустое множество 0 является минимальным элементом булеана по включению.
46 Глава 1. Множества и отношения ТЕОРЕМА Во всяком конечном непустом частично упорядоченном множестве существует минимальный элемент. Доказательство От противного. Пусть -1(3х G М Sy € М у -< х). Тогда Vх € М 3 у € М у -<х ==> 3Vi Ui+i -к Uj &ui+1 щ. Поскольку \M| < оо, имеем 3 г, j i < j&Ui = Uj. Но по транзитивности Ui Uj Uj — Uj. Таким образом, wi+i -< щкиц.1 >- щ => щ+1 =щ — противоречие. ЗАМЕЧАНИЕ------------------------------------------------------- Вполне упорядоченное конечное множество содержит один минимальный элемент, а в произвольном конечном частично упорядоченном множестве их может быть несколько. ТЕОРЕМА Всякий частичный порядок на конечном множестве может быть до- полнен до линейного. Доказательство См. следующий подраздел. ЗАМЕЧАНИЕ---------—.......—------------------------------------ В данном случае слова «может быть дополнен» означают, что существует отношение пол- ного порядка, которое является надмножеством заданного отношения частичного порядка. 1.8.3. Алгоритм топологической сортировки Рассмотрим алгоритм дополнения частичного порядка до линейного на конечном множестве. Алгоритм 1.7. Алгоритм топологической сортировки Вход: частично упорядоченное множество U. Выход: вполне упорядоченное множество W. while U / 0 do m: = M(U) { функция М возвращает минимальный элемент } yield т { такой элемент т существует по теореме предыдущего раздела } U: = U\{m} end while
1.9. Замыкание отношений 47 ЗАМЕЧАНИЕ —--------------—-----------------———----------------——___ Всякая процедура, генерирующая объекты с помощью оператора yield, определяет линей- ный порядок на множестве своих результатов. Действительно, линейный порядок — это последовательность, в которой объекты генерируются во время работы процедуры. Обоснование Существование функции М обеспечивается первой теоремой раздела 1.8.2. □ ЗАМЕЧАНИЕ---------——----------------------------------------------—- Если отношение порядка представлено матрицей, то функцию М можно реализовать, например, так — найти, в матрице отношения первую строку, содержащую только нули. 1.8.4. Монотонные функции Пусть А и В — упорядоченные множества и f: А -> В. Тогда если ai < а2 ==> /(«i) /(аг), то функция f называется монотонной. а если ai < а2 => /(щ) < /(аг), то функция / называется строго монотонной. Пример Функция мощности конечного множества ||: 2м -> N является монотонной. 1.9. Замыкание отношений Замыкание является весьма общим математическим понятием, рассмотрение конкретных вариантов которого начинается в этом разделе и продолжается в дру- гих главах книги. Неформально говоря, замкнутость означает, что многократное выполнение допустимых шагов не выводит за определенные границы. Например, предел сходящейся последовательности чисел из замкнутого интервала [а, Ь] обя- зательно принадлежит этому интервалу, а предел сходящейся последовательно- сти чисел из открытого (то есть не замкнутого) интервала (а, Ь) может лежать вне этого интервала. В некоторых случаях можно «расширить» незамкнутый объект так, чтобы он оказался замкнутым. 1.9.1. Замыкание отношения относительно свойства Пусть R и R' — отношения на множестве М. Отношение R' называется замыка- нием R относительно свойства С, если: 1. R' обладает свойством С: C(R')\ 2. R' является надмножеством R: Rc R’; 3. R' является наименьшим: C(R") 8г R с R" =► R' G R".
48 Глава 1. Множества и отношения 1.9.2. Транзитивное и рефлексивное транзитивное замыкания Пусть R+ — объединение положительных степеней R, a R* объединение не- отрицательных степеней R'. со со R+ = (J R\ Я*: = (J Ri i=l i=0 ТЕОРЕМА R+ — транзитивное замыкание R. Доказательство Проверим выполнение свойств замыкания при условии, что свойство С — это транзитивность. 1. Пусть aR+b&cbR+c. Тогда 3n aftnfe&3m bRmc. Следовательно, Зет,..., сп_ 1 aRc^R... Rcn-^Rb и 3di,... ,dm-i bRd^R... Rdm_iRc. Таким образом, aRc^R.. .Rcn-iRbRdiR... Rdm~iRc ==> aRn+m+1c ==> aR+c. 2. R= R1 =*Rc (J R? ==> R c R+. ' 1=1 3. aR+b => 2 k aRkb => 3ci,..., c^-i aRc^R... Rc^-iRb', RrR" => аЯ"С1Я" ... R"ck-iR"b => aR"b. Таким образом, R+ C R". □ ТЕОРЕМА R* — рефлексивное транзитивное замыкание R. Вычислить транзитивное замыкание заданного отношения можно следующим образом: r+ = = Qff => | я+1 = \/@= \/[лГ i=l i=l i=l i=l Такое вычисление будет иметь сложность О(п4). 1.9.3. Алгоритм Уорш ал л а Рассмотрйм алгоритм вычисления транзитивного замыкания отношения R на множестве М, \М| = п, имеющий сложность О(п3). Алгоритм 1.8. Алгоритм Уоршалла Вход: отношение, заданное матрицей R. Выход: транзитивное замыкание отношения, заданное матрицей Т. S: = R for г from 1 to п do
Упражнения 49 for j from 1 to n do for к from 1 to n do T[j, k]: = S[j, к] V S[j, i] & S[i, fc] end for end for S: = T end for Обоснование На каждом шаге основного цикла (по i) в транзитивное замыкание добавляются такие пары элементов с номерами ink (то есть T\j, : = 1), для которых суще- ствует последовательность промежуточных элементов с номерами в диапазоне от 1 до i, связанных отношением R. Действительно, последовательность проме- жуточных элементов с номерами в диапазоне от 1 до г, связанных отношением R, для элементов с номерами j и к существует в одном из двух случаев: либо уже существует последовательность промежуточных элементов с номерами в диапа- зоне от 1 до i - 1 для пары элементов с номерами j и к, либо существуют две последовательности элементов с номерами в диапазоне от 1 до г — 1 — одна для пары элементов с номерами j и г и вторая для пары элементов с номерами ink. Именно это отражено в операторе T{j, к]: = S[j, fc] V S[j, г] & S[i, к]. После оконча- ния основного цикла в качестве промежуточных рассмотрены все элементы, и, таким образом, построено транзитивное замыкание. □ Комментарии Основные сведения, изложенные в этой главе, можно найти в любом учебнике по (дискретной) математике. Алгоритм 1.2 описан в [14]. Алгоритмы 1.3, 1.4, 1.6 — общеизвестный программистский фольклор. Алгоритм 1.7 описан в фундамен- тальной книге [8], которая входит в «золотой список» обязательного чтения лю- бого программиста. Алгоритм 1.8 описан во многих источниках, например в [1]. Упражнения 1.1. Существует ли множество всех множеств? 1.2. Доказать, что |А U В| = |А| + |В| - |А П В|. 1.3. Доказать, что A U В = (А П В) U (А П В) U (А. П В). 1.4. Доказать, что Q(2k + m) = Q(2k - т) для 0 т 2к - 1, где Q — функция из алгоритма 1.2. 1.5. Пусть Q: = {(m,n) | m,n€ N&m = n2}. Какими свойствами обладает отно- шение Q? 1.6. Доказать теорему из подраздела 1.6.3. 1.7. Доказать, что если = — отношение эквивалентности на конечном множестве М и |М| = \М/ = |. то Va: е М |[ж]=| = 1.
50 Глава 1. Множества и отношения 1.8. Пусть А — вполне упорядоченное множество с отношением порядка R. Вве- дем отношение R на множестве кортежей элементов из А следующим обра- зом: (ai,... ,am)R(bi,... ,bn): =(m n&Vi € 1..т а» = bi) V (Зг € 1..7П (aiRbi &V j G l..i -1 аг = ^)). Такое отношение называется лексикографическим, или алфавитным поряд- ком. Доказать, что алфавитный порядок есть полный порядок на множестве кортежей А+ : = |J“ i А\ 1.9. Доказать вторую теорему из подраздела 1.9.2.
ГЛАВА 2 Алгебраические структуры Алгебраические методы описания моделей находят самое широкое применение при формализации различных предметных областей. Грубо говоря, при постро- ении модели предметной области все начинается с введения подходящих обо- значений для операций и отношений с последующим исследованием их свойств. Владение алгебраической терминологией, таким образом, входит в арсенал средств, необходимых для абстрактного моделирования, предшествующего прак- тическому программированию задач конкретной предметной области. Материал этой главы помимо введения в терминологию общей алгебры содержит некото- рое количество примеров конкретных алгебраических структур. В начале бегло рассматриваются классические структуры, которые обычно включаются в курсы общей алгебры, а затем обсуждаются некоторые более специальные структуры, наиболее часто применяемые в конкретных программных построениях. 2.1. Операции и алгебры Словом «алгебра» обозначают, вообще говоря, не только отрасль математики, но и один из конкретных объектов, изучаемых в этой отрасли. К счастью, «алге- бры» в узком смысле здесь не рассматриваются, а потому для краткости и без риска возникновения недоразумений слово «алгебра» используется как родовое понятие для обозначения разнообразных алгебраических структур. 2.1.1. Алгебраические структуры Всюду определенная (тотальная) функция <р: Мп -> М называется п-арной (п-местной) операцией на М. Если операция <р — бинарная (то есть <р: М х М —> М), то будем писать atpb вместо <р(а, Ь) или а о Ь, где о — знак операции. ЗАМЕЧАНИЕ----------------------------------------------------- Такая форма записи называется инфиксной.
52 Глава 2. Алгебраические структуры Множество М вместе с набором операций Е = {</?!,..., рт}, р{: Mni -> М, где щ — арность операции <р4, называется, алгебраической структурой, универсаль- ной алгеброй или просто алгеброй. Множество М называется основным (несущим) множеством, или основой (носителем)-, вектор арностей (щ,... ,пт) называет- ся типом; множество операций Е называется сигнатурой. Запись: {М; Е) или (М; ЗАМЕЧАНИЕ----------------------------------------------------------- Операции уч конечноместны (финитарны), сигнатура Е конечна. Носитель не обязательно . конечен, но не пуст. Если в качестве допускаются не только функции, но и отношения, то множе- ство М вместе с набором операций и отношений называется моделью. В приложениях обычно используется следующее обобщение понятия алгебры. Пусть М - {Mi,... ,Мп} — множество основ, S = {pi, -. • ,рт} сигнатура, причем р,: Mi, х ••• х Min —> Mj. Тогда (M;E) называется многоосновной ал- геброй. Другими словами, многоосновная алгебра имеет несколько носителей, а каждая операция сигнатуры действует из прямого произведения некоторых но- сителей в некоторый носитель. 2.1.2. Замыкания и подалгебры Подмножество X с М называется замкнутым относительно операции у, если Vxi,...,xn € X y>(xi,...,xn) € X. Если X замкнуто относительно всех р € S, то (X; Ех) называется подалгеброй (М; Е), где Ех = {р* },pf = 4>i\xk,k = щ. Пример 1. Алгебра (К; +, •) — поле действительных чисел. Тип — (2,2). Все конечные подмножества, кроме {0}, не замкнуты относительно обеих операций. Поле рациональных чисел (Q; +, ) образует подалгебру. 2. Алгебра (2м; U, Л,- ) — алгебра подмножеств над множеством М. Тип — (2,2,1). При этом (2х; U, П,_ ) для любого подмножества X множества М обра- зует подалгебру. 3. Алгебра ({/ | /: R -> R}; где — операция дифференцирования. Мно- жество элементарных функций образует подалгебру. ТЕОРЕМА Непустое пересечение подалгебр образует подалгебру. Доказательство Пусть {Xi; EXi) - подалгебра {М; Е). Тогда V г V j pf* (хг,..., xnj )eXi=* ^‘(xi,...,^) е riXi. □
2.1. Операции и алгебры 53 Замыканием множества X С М относительно сигнатуры Е (обозначается [X]s) называется множество всех элементов (включая сами элементы Х~), которые можно получить из X, применяя операции из S. Если сигнатура подразумевает- ся, ее можно не указывать. Пример В алгебре целых чисел (Z-, +, •) замыканием числа 2 являются четные числа, то есть [{2}] = {n е Z | n = 2k & k е Z}. Свойства замыкания: 1. х с Y => [X] с [У]; 2. X с [X].; 3. [[Х]] = [Х]; 4. [X] U [У] с [XU У]. 2.1.3. Алгебра термов Пусть заданы сигнатура S — (ф1,...,<рт) типа N = (п\,...,пт) и множество переменных V = {xi, х2,...}. Определим множество термов Т в сигнатуре S следующим образом: 1. V с Т; 2. 11,..., tn( G Т Pi g Е ==> p(ti,..., tni) € T. Алгебра (Г; Е) называется свободной алгеброй термов, или Е-алгеброй. ОТСТУПЛЕНИЕ------------------------------------------------------------ Носителем Е-алгебры является множество термов, то есть формальных выраженйй, по- строенных с помощью знаков операций сигнатуры Е. Таким образом, с Е-алгеброй не связано никакое конкретное множество, являющееся носителем. Поэтому Е-алгебры ис- пользуются в программировании для определения абстрактных типов данных. 2.1.4. Система образующих Множество М' с М называется системой образующих алгебры (М;Е), если [М']Е = М. Если алгебра имеет конечную систему образующих, то она называ- ется конечно-порожденной. Бесконечные алгебры могут иметь конечные системы образующих. Пример Алгебра натуральных чисел — (N;+) — имеет конечную систему образующих 1 GN.
54 Глава 2. Алгебраические структуры 2.1.5. Свойства операций Некоторые часто встречающиеся свойства операций имеют специальные назва- ния. Пусть задана алгебра {М;£) и а, b, с е М; о, о е S; °, о: М х М —> М. Тогда: 1. Ассоциативность'. (а о 6) о с = а о (6 о с); 2. Коммутативность: а о Ь = Ь о а; 3. Дистрибутивность слева: а о (& о с) = (а о Ь) о (а о с); 4. Дистрибутивность справа: (а о Ь) о с = (оос) о (Joe); 5. Поглощение: (а о Ь) о а = а; 6. Идемпотентность: а о а = а. Пример 1. Ассоциативные операции: сложение и умножение чисел, объединение и пере- сечение множеств, композиция отношений. Неассоциативные операции: воз- ведение чисел в степень, вычитание множеств. 2. Коммутативные операции: сложение и умножение чисел, объединение и пе- ресечение множеств. Некоммутативные операции: умножение матриц, компо- зиция отношений. 3. Дистрибутивные операции: умножение относительно сложения чисел. Недис- трибутивные операции: возведение в степень дистрибутивно относительно умножения справа, но не слева: ((ai>)c = асЬс,аЬс аьас). 4. Пересечение поглощает объединение, объединение поглощает пересечение^ Сложение и умножение не поглощают друг друга. 5. Идемпотентные операции: наибольший общий делитель натуральных чисел, объединение и пересечение множеств. Неидемпотентные операции: сложение и умножение чисел. 2.2. Морфизмы Понятие изоморфизма, введенное в этом разделе, является одним из ключевых. Поэтому следует обратить особое внимание на посвященный изоморфизму под- раздел 2.2.2. 2.2.1. Гомоморфизм Алгебры с различными типами имеют различное строение. Пусть А = (А; ,..., рт) и Ъ = {В; ,..., фт) — две алгебры одинакового типа. Если существует функция f:A-+B, такая что Vie 1..ТП f(y?i(ai,...,an)) = ),...,/(an)), (2.1) то говорят, что f — гомоморфизм из А в Ъ.
2.2. Морфизмы 55 Пусть А — (А;р), Ъ = (В;^), тип = (1) и /: А-> В. Действие этих функций можно изобразить с помощью следующей диаграммы: А ——» А 4 I' В —в Пусть f — гомоморфизм. Тогда если взять конкретное значение а & А и дви- гаться по двум различным путям на диаграмме, то получится один и тот же элемент b 6 В (так как /(<^(а)) = V>(/(a))). В таком случае диаграмма называет- ся коммутативной. Коммутативной диаграмма называется потому, что условие гомоморфизма (2.1) можно переписать так: о f — f оф. Пример Пусть А = (N; +), ® = (Ni0; +ю)> где N10 = {0,1,2,3,4,5,6,7,8,9}, а -Но — сложение по модулю 10. Тогда f: = a mod 10 — гомоморфизм из Л в В Гомоморфизмы, обладающие дополнительными свойствами^ имеют специальные названия: ч ► Гомоморфизм, который является инъекцией, называется мономорфизмом. ► Гомоморфизм, который является сюръекцией, называется эпиморфизмом (или эпиоморфизмом). к Гомоморфизм, который является биекцией, называется изоморфизмом. ► Если А = В, то гомоморфизм называется эндоморфизмом, а изоморфизм на- зывается автоморфизмом. 2.2.2. Изоморфизм Пусть А — (А; y>i,..., <pm) и Ъ = (В;., фт) — две алгебры одного типа, и f: А —> В — изоморфизм. ТЕОРЕМА Если f: А —> В — изоморфизм, то /-1: В —> А тоже изоморфизм. Доказательство Рассмотрим произвольную операцию р из сигнатуры А и соответствующую ей операцию ф из сигнатуры ®. Имеем: /(y>(ai,..., an)) = </>(/(ai),..., /(an)), кроме того, f — биекция. Обозначим bY: = /(ai),..., bn : = /(an), при этом ai =/-1(bi),...,an = r1(bn).
56 Глава 2. Алгебраические структуры Тогда /-1 (^(61,..., Ь„)) = /-1 (^(/(ai), • • •, /(ап))) = Л1 (/(^(«1 — y>(ai,... ,an) = (bi), • • •,/-1(Ьп)). “n))) “ □ Если f : А —> В — изоморфизм, то алгебры А и Ъ называют изоморфными и обозначают так: А ~ Ъ. ТЕОРЕМА Отношение изоморфизма на множестве однотипных алгебр является эквивалентностью. Доказательство 1. Рефлексивность: Л ~ Л, f'. — I. f f~1 2. Симметричность: Л ~ ® => Ъ ~ А- 3. Транзитивность: А ~ Ъ & Ъ ~ S => A S- □ Пример 1. Пусть А = (N; +), Ъ — ({n | n = 2k, k е N} ; +) — четные числа. Тогда А ~ Ъ. 2. А = (2м; П, U) X Ъ = (2м; U, п), /(X) = X. 3. Л = (й+;-)~® = (К;+). Понятие изоморфизма является одним из центральных понятий, обеспечиваю- щих применимость алгебраических методов в различных областях. Действительно, пусть А = (А; Е<Д Ъ = (В; Яу} и А ~ Ъ. Пусть в алгебре А уста- новлено свойство Ф1 = Ф2, где Ф! и Ф2 — некоторые формулы в сигнатуре Ev. Поскольку алгебры А и Ъ изоморфны, отсюда немедленно следует, что в алгебре Ъ справедливо свойство Ф1 = Ф2, где Ф! и Ф2 — формулы, полученные из фор- мул Ф1 и Ф2 заменой операций из сигнатуры Ev на соответствующие операции из сигнатуры Е^,. Таким образом, достаточно установить некоторое свойство в од- ной алгебре, и оно автоматически распространяется на все изоморфные алгебры. Алгебраические структуры принято рассматривать с точностью до изоморфизма, то есть рассматривать классы эквивалентности по отношению изоморфизма. 2.3. Алгебры с одной операцией Естественно начать изучение алгебраических структур с наиболее простых. Са- мой простой структурой является алгебра с одной унарной операцией, но этот
2.3. Алгебры с одной операцией 57 случай настолько тривиален, что про него нечего сказать. Следующим по по- рядку является случай алгебры с одной бинарной операцией о: М х М —> М, который рассматривается в этом разделе. 2.3.1. Полугруппы Полугруппа — это алгебра с одной ассоциативной бинарной операцией: а о (Ь о с) — (а о Ь) о с. Пример 1. Множество слов А+ в алфавите А образует полугруппу относительно опера- ции конкатенации. 2. Всякое множество функций, замкнутое относительно суперпозиции, является полугруппой. Если в полугруппе существует система образующих, состоящая из одного эле- мента, то такая полугруппа называется циклической. Пример (N;+) является циклической полугруппой, поскольку {1} является системой образующих. Пусть Р = (М; о) — полугруппа с конечной системой образующих А = {ai,... ,ап}. Тогда Ух € М 3yi,... ,yk е А х = yi о о ук. Если опустить обозначение опе- рации о, то всякий элемент а € М можно представить как слово а в алфавите А, то есть М с А*. Обозначим через а элемент, определяемый словом а. Слова а и /3 могут быть различны, но соответствующие им элементы а и /3 могут быть равны: а = fl, а, /3 ё А*, a, fl е М. Такие равенства называются определяющими соотношениями. Если в полугруппе нет определяющих соотношений, и все раз- личные слова, составленные из образующих, суть различные элементы носителя, то полугруппа называется свободной. Всякая полугруппа! может быть получена из свободной введением определяющих соотношений. Отношение равенства слов в полугруппе с определяющими соотношениями является отношением эквива- лентности. Пример В полугруппе (N; +) имеется конечная система образующих {1}. Другими слова- ми, каждое натуральное число можно представить, как последовательность зна- ков 1. Очевидно, что различные слова в алфавите {1} суть различные элементы носителя, то есть эта полугруппа свободна.
58 Глава 2. Алгебраические структуры ТЕОРЕМА (Марков1—Пост) Существует полугруппа, в которой проблема распо- знавания равенства слов алгоритмически неразрешима. Доказательство Без доказательства. □ 2.3.2. Моноиды Моноид это полугруппа с единицей: 3eVaaoe = eoa = а. Пример 1. Множество слов А* в алфавите А вместе с пустым словом Л образует моноид. 2. Пусть Т — множество термов над множеством переменных V и сигнатурой Е. Подстановкой, или заменой переменных, называется множество пар СТ = где ti — термы, а — переменные, причем Vj 0 Результатом применения подстановки ст к терму t (обозначается ter) называется терм, который полу- чается заменой всех вхождений переменных на соответствующие термы t<. Композицией подстановок ст2 = {^//vj}i€/ и ст2 = {tj//Vj}jej называется под- становка ст: = Ст1 о ст2 : ={tk//vk}keK, где К = IU J, а {tiCTi, если к el, tj, если к I. Множество подстановок образует моноид относительно композиции, причем тождественная подстановка {и,//^} является единицей. ТЕОРЕМА Единица единственна. Доказательство Пусть 3 ei, е2 V a aoei = eioa = a& aoe2 = e2oa = a. Тогда Ci о е2 = Cj & ei о е2 = б2 ===^ 61 = е2. ТЕОРЕМА Всякий моноид над М изоморфен некоторому моноиду преобразова- ний над М. ХА. А. Марков (1903-1979)
2.3. Алгебры с одной операцией 59 Доказательство Пусть fi — (М; •) — моноид над М — {е, а, Ь, с,...}. Построим У = (F; о) — моно- ид преобразований над М, где F: = {fm: М -> М | fm(x): = х • тп}т^м, а о — суперпозиция функций, h: М —> F, h(m) : — fm- Тогда: 1. J — моноид, поскольку суперпозиция функций ассоциативна, /е — тожде- ственная функция (так как fe(x) = х • е = х), и F замкнуто относительно о (так как /а о fb = fMb: fa.b(x) = а; • (а • Ь) = (а; • а) • b = fa(x) »b = fb(fa(x)). 2. h — гомоморфизм (так как h(a • b) = fa,b = fa 0 /ь = h(a) ° ^(0)- 3. h — биекция, поскольку h — сюръекция по построению, и h — инъекция (так как (/а(е) = е • а = а & /ь(е) = е • Ь = Ь) => (а Ь => fa /ь)). □ 2.3.3. Группы Группа — это моноид, в котором Va За-1 ооо1"1 = а-1 о а = е. Элемент а-1 называется обратным. Пример 1. Множество невырожденных квадратных матриц порядка п образует группу относительно операции умножения матриц. Единицей группы является еди- ничная матрица. Обратным элементом является обратная матрица. 2. Множество подстановок на множестве М, то есть множество взаимно одно- значных функций является группой относительно операции су- перпозиции. Единицей группы является тождественная функция, а обратным элементом — обратная функция. ТЕОРЕМА Обратный элемент единственен. Доказательство Пусть а о а-1 = а-1 oa = e& aob = boa = e. Тогда а-1 = а-1 о е = а-1 о (а о Ь) = (а-1 oa)ob = eob = b. О ТЕОРЕМА В группе выполняются следующие соотношения: 1. (а о Ь)-1 = Ь-1 о а-1; 2. а о Ь = а о с ==> Ь = с; 3. Ьо а = со а => b = с; 4. (а-1)-1 = а.
60 Глава 2, Алгебраические структуры Доказательство 1. (аоб)о(Ь 1оа 1)=ао (bob 1)оа 1 = аоеоа 1=аоа 1 — е. 2. aob = ао с =Ф- а 1 о (а о б) — а 1 о (а о с) ==> (а 1 о а) о Ь = (а 1 о а) ос =$• =4» е о b = е о с ==> b = с. 3. b о а — со а ==> (боа) оа 1 = (с о а) о а-1 ==> Ьо (ао а 1) = с о'(а о а х) =^- =ф b о е = с о е => b = с. 4. (а-1) ° а = а-1 о а = е. □ ТЕОРЕМА В группе можно однозначно решить уравнение аох = Ь, (решение: х = а 1оЬ). Доказательство аох — Ъ ==> а-1 о (аох) - а-1 ° b => (а"1 о а) о х = а-1 о Ь=> еох = а-1ob => ==> х = а-1 ob. □ Коммутативная группа, то есть группа, в которой а о b = b о а, называется абелевой1. В абелевых группах приняты следующие обозначения: групповая операция обозначается + или ф, обратный элемент к а обозначает- ся —а, единица группы обозначается 0 и называется нулем. Пример 1. (Z;+) — множество целых чисел образует абелеву группу относительно сло- жения. Нулем группы является число 0. Обратным элементом является число с противоположным знаком: х-1: = — х. 2. (Q+; •) — множество положительных рациональных чисел образует абелеву группу относительно умножения. Нулем группы является число 1. Обратным элементом является обратное число: (m/n)"1 : = п/т. 3. (2м; А) — булеан образует абелеву группу относительно симметрической раз- ности. Нулем группы является пустое множество 0. Обратным элементом является дополнение: X"1: = М \ X. 2.4. Алгебры с двумя операциями В этом разделе рассматриваются алгебры с двумя бинарными операциями: Ф, 0: М х М -> М, которые условно называются «сложением» и «умножением», соответственно. 1 Нильс Хенрик Абель (1802-1929)
2.4. Алгебры с двумя операциями 61 2.4.1. Кольца Кольцо — это множество М с двумя бинарными операциями Ф и 0, в котором: 1. (а ф Ь) ф с = а ф (Ь ф с) сложение ассоциативно; 2. ВОе М Ча а®0 = 0®а = а существует нуль; 3. V а В - a а ф -a = 0 существует обратный элемент; 4. а ф Ь = 6 ф а сложение коммутативно, то есть кольцо — абелева группа по сложению; 5. а ® (6 ® с) = (а ® Ь) 0 с умножение ассоциативно, то есть кольцо — полугруппа по умножению; 6. a 0 (Ьфс) = (а® 6) ф (а ® с) умножение дистрибутивно (аф Ь) ® с = (о® с) ф (6® с) слева и справа. Кольцо называется коммутативным, если 7. a®b=b®a умножение коммутативно. Коммутативное кольцо называется кольцом с единицей, если 8. Э1€Ма®1 = 1®о = а существует единица; то есть кольцо с единицей — моноид по умножению. ТЕОРЕМА В кольце выполняются следующие соотношения: 1. О 0 а = а 0 0 = 0; 2. a 0 (—Ь) = (—а) 0 Ь — —(а 0 Ь); 3. (—а) 0 (—6) = а 0 Ь. Доказательство 1. 0 0 а = (0 ф 0) 0 а ~ (б 0 а) ф (0 0 а) => => -(О0а)ф(О0а) = -(О0а)ф((О0а)ф(О0а)) = (-(О0а)ф(О0а))ф(О0а) ==> =4» 0 = 0 ф (0 0 а) = 0 0 а. 2. (а0(—6)) Ф (а 0Ь) = а 0 (—6ф6) = а0О = О ==> ==> а 0 (—6) = —(а 0 6), (а 0 Ь) ф ((—а) 0 6) = (а ф (—a)) 0b = 0 0b = 0 ==> ==> (—а) 0 Ь = — (а 0 Ь). 3. (—а) 0 (—Ь) = — (а 0 (—6)) = — (—(а 0 6)) = а 0 Ь. О Пример (Z;4-,*) — коммутативное кольцо с единицей. Для любого натурального п (Zn;+,*) — коммутативное кольцо с единицей. В частности, машинная ариф- метика целых чисел (Z2is; +, *) — коммутативное кольцо с единицей.
62 Глава 2. Алгебраические структуры 2. 4.2. Области целостности Если в кольце Зж^03у/0я:®у = 0, то ж называется левым, а у — правым делителем нуля. Пример В машинной арифметике (Z21&; +, *) имеем 256 * 128 = 0. В группе а о Ь = а о с => Ь = с, однако в произвольном кольце это не так. ТЕОРЕМА Пусть а 0. Тогда (а ® b = а ® с ==> b = с)1 > <==> (ж / 0&у 0 => х 0). (b®a = c®a=>b = c) ( v ' Доказательство =>: От противного. Пусть х®у — 0. Тогда х / 0&х®у — 0&ж® 0 = 0 => у = 0, у / 0 & а: ® у = 0 & 0 ®у = 0 ==> х = 0. <=: 0 = (а®6)ф(—(а®6)) = (а®6)ф(—(а®с)) = (а®£>)ф(а®(—с)) ±= а®(бф(—с)), а ® (Ь ф (—с)) = 0 & а / 0 => Ъ Ф (—с) = 0 => Ь = с. □ Коммутативное кольцо с единицей, не имеющее делителей нуля, называется областью целостности. Пример Целые числа (Z; +, *) являются областью целостности, а машинная арифметика (Z2is; +, *) — не является. 2. 4.3. Поля Поле — это множество М с двумя бинарными операциями фи®, такими что: 1. (а ф Ь) ф с = а ф (Ь ф с) сложение ассоциативно; 2. 30 е М афО = Офа = а существует нуль; 3. Va 3 - а а ф — а == 0 существует обратный элемент по сложению; 4. а ф b = Ь фа сложение коммутативно, то есть поле — абелева группа по сложению; 5. а ® (Ь ® с) = (а ® Ь) ® с умножение ассоциативно; 6. 31eAfa®l = l®a = a существует единица; 7. Va / 0 За-1 а-1 ® а = 1 существует обратный элемент по умножению; 8. а®Ъ — 6 ® а умножение коммутативно, то есть поле — абелева группа по умножению;
2.5. Векторные пространства 63 9. а® (Ьфс) = (eg i>) ф (а® с) умножение дистрибутивно относительно сложения. Пример 1. (Ж; +, •) — поле вещественных чисел. 2. (Q; +, •) — поле рациональных чисел. 3. Пусть Е2: ={0,1}. Определим операции ф, •: Е2 х Е2 -> Е2 следующим обра- зом: 00= 0, 01 = 0, 1 • 0 = 0, 1 • 1 = 1, ОфО = 0, Оф 1 = 1, 1 фО = 1, 1 ф 1 = 0. Тогда £2 : = (Е2; ф, •) является полем и называется двоичной арифметикой. ТЕОРЕМА В поле выполняются следующие соотношения. 1. (—а) = а® (—1); 2. -(а ф Ь) = (-а) ф (-6); 3. а 0 => (а-1) 1 = а; 4. а ® b = 0 ==> а = 0 V b — 0. Доказательство 1. (а ® (-1)) фа = (а® (-1)) ф (а ® 1) = а ® (-1 ф 1) = а ® 0 = 0. 2. (а ф Ь) ф ((-а) ф (-6)) = (а ф Ь) ф ((-6) ф (-а)) = а ф (Ь ф (-6)) ф (-а) = = а ф 0 Ф (—а) = а Ф (—а) = 0. 3. а-1 ® а = 1. 4. а®д = 0& а/ 0 => => Ь = 1 ® b = (а-1 ® а) ® Ъ — а-1 ® (а ® Ь) = а-1 ® 0 = 0, а<8>Ь = 0&д/0 => => а = 1 ® а = (д-1 ® Ь) ® а = Ь-1 ® (Ь ® а) = д-1 ® (а ® Ь) = Ь-1 ® 0 = 0. □ ТЕОРЕМА Если а 0, то в поле единственным образом разрешимо уравнение a®x®b = Q, (х = —(а-1) ® Ь). Доказательство а ® х ф Ъ = 0 =$ а ® х ф b ф (—6) = 0 ф (—Ь)а ® г ф (Ь ф (—6)) = — b => => а ® х + 0 = — b => а ® х = — b => а-1 ® (а ® х) = а-1 ® (—6) => => (а-1 ® а) ® х = —(а-1 <8> Ь) => 1 ® х = —(а-1 <8> Ъ) х = —(а-1 <8> Ь). О 2.5. Векторные пространства Понятие векторного пространства должно быть известно читателю из курса сред- ней школы и других математических курсов. Обычно это понятие ассоциируется
64 Глава 2. Алгебраические структуры с геометрической интерпретацией векторов в пространствах Ж2 и R3. В этом раз- деле даны и другие примеры векторных пространств, которые используются в последующих главах для решения задач, весьма далеких от геометрической ин- терпретации. 2.5.1. Определения Пусть 3 = (F; +, •) — некоторое поле с операцией сложения 4-, операцией умно- жения •, аддитивной единицей 0 и мультипликативной единицей 1. Пусть V = (V; +) — некоторая абелева группа с операцией 4- и единицей О. Если существу- ет операция F х V —> V (знак этой операции опускается), такая что для любых a, b G F и для любых х, у G V выполняются соотношения: 1. (а 4- Ь)х = ах 4- £>х, 2. а(х 4- у) = ах 4- ау, 3. (а • £>)х = а(6х), 4. 1х = х, то V называется векторным пространством над полем У, элементы F называ- ются скалярами, элементы V называются векторами, а необозначенная операция F х V -> V называется умножением вектора на скаляр. Пример 1. Пусть 3 — (F; 4-, •) — некоторое поле. Рассмотрим множество кортежей Fn. Тогда 3™ = (Fn; 4-), где (аь..., ап) 4- (&г,..., bn): =(aj 4- &i,..., ап 4- Ьп), явля- ется абелевой группой, если -(ai,... ,an) :=(-ai,..., -ап) и О :=(0,.... ,0). Положим a(ai,..., ап): =(а • ai,..,, а ап). Тогда У" является векторным про- странством над 3 для любого (конечного) п. В частности, Rn является век- торным пространством для любого п. Векторное пространство R2 (и R3) имеет естественную геометрическую ин- терпретацию (рис. 2.1). 2. Двоичная арифметика £2 = (£2;®, •) является полем, а булеан (2м; Д) с симметрической разностью является абелевой группой. Положим IX: = X, ОХ: = 0. Тогда булеан с симметрической разностью является векторным про- странством над двоичной арифметикой. 2.5.2. Свойства нуль-вектора Единица группы V (если V — векторное пространство) называется нулъ-вектором и обозначается О. ТЕОРЕМА Vx € V Ох = О, Va G F aO = О.
2.5. Векторные пространства 65 Доказательство 1. Ох = (1 - 1)х = 1х - 1х — х - х = О. 2. аО = а(О — О) = аО — аО = (а — а)О = 00 = 0. □ 2.5.3. Линейные комбинации Если V — векторное пространство над полем S', S — некоторое множество век- торов, S с V, то сумма вида п at 6 F, Xi^S i=l называется линейной комбинацией векторов из S. Пусть X = {х1;..., х*,} — конечное множество векторов. Если k 57 aixi = 0 =► «1 = “2 • • • = = О, i=l то множество X называется линейно независимым. В противном случае, то есть если ?. fc л 2ai,... ,ak е F \J ai/0&£aiXi=0, i=l то множество X называется линейно зависимым.
66 Глава 2. Алгебраические структуры ТЕОРЕМА Линейно независимое множество векторов не содержит нуль-лектора. Доказательство Пусть 5 = {0,х2,... ,Хк},Х1 : = О. Положим ai -1, а2: = 0, аь:~=0. Тогда 52 a»xi — Ю + 0х2 Ч-F0хк =0+0++0= О. □ £=1 2.5.4. Базис и размерность Подмножество векторов S G V, такое что любой элемент V может быть пред- ставлен в виде линейной комбинации элементов S, называется порождающим множеством пространства V. Конечное линейно независимое порождающее мно- жество называется базисом векторного пространства. Пусть векторное пространство V имеет базис В = {е1;..., еп}. ТЕОРЕМА Каждый элемент векторного пространства имеет единственное представление в данном базисе. Доказательство П п Пусть X — 52 aiei И X = 52 Ь»еЬ 1=1 1=1 Тогда О = х - х = 52 aiei - 52 btei = 52 (ai ~ Mei => i=l £=1 ,£=1 Vie l..n ai — bi = 0 ==> Vi ai = bi. □ ТЕОРЕМА Пусть В = {e1;... ,e„} — базис, a X = {xi, . ,xm} — линейно неза- висимое множество пространства V. Тогда п т. Доказательство От противного. Пусть п < т и В — базис. Тогда EUi,... ,ап G F Xi = aiei + +anen n Имеем xi / О => V ai / 0. Пусть для определенности ai / 0. Тогда (свойства 1=1 поля) ei = af xXi - (а^1а2)е2 - (а^1ап)еп. Так как В порождает V, то и {xi,e2,... ,еп} тоже порождает V. Аналогично {xi, х2, е3,..., еп} порождает V. Продолжая процесс, получаем, что {xi,...,хп} порождает V. Следовательно, п п п Хп+1 = 52 / 0 =Ф Хп+1 - 52 biXi = 0 => i=l г=1 г~ 1 X — линейно зависимое множество. □
2.6. Решетки 67 ТЕОРЕМА Пусть Bi и В2 — базисы векторного пространства V, тогда |Я1|.= |В2|. Доказательство Bi — базис, и В2 — линейно независимое множество. Следовательно, |Z?i| |В2|. С другой стороны, В2 — базис, и В± — линейно независимое множество. Следовательно, |В2| > |#1|- Имеем |Bi| = |В2|. □ Мощность любого базиса векторного пространства V называется размерностью векторного пространства и обозначается dim(V). Векторное пространство, имею- щее базис, называется конечномерным. Пример 1. Одноэлементные подмножества образуют базис булеана, dim2w = |М|. 2. Кортежи вида (0,..., 0,1,0,..., 0) образуют базис пространства 5”, dim У" = n. 2.6. Решетки Решетки иногда называют «структурами», но слово «структура» перегружено, и мы не будем использовать его в этом значении. Решетки сами по себе часто встречаются в разных программистских задачах, но еще важнее то, что поня- тие решетки непосредственно подводит нас к понятию булевой алгебры, которе имеет множество приложений в программировании и вычислительной технике. 2.6.1. Определения Решетка — это множество М с двумя бинарными операциями ни, такими что выполнены следующие условия (аксиомы решетки): 1. идемпотентность: а П а = а, a U а = а; 2. коммутативность: а П b = b П а aUb = bU а; 3. ассоциативность: (а П Ь) П с — а П (Ь П с), (а U £>) U с = а U (£> U с); 4. поглощение: (а Г) b) U а — а, (a U Ь) П а = а; 5. Решетка называется дистрибутивной, если a U (£> П с) = (a U Ъ) П (a U с), а П (£> U с) = (а П b) U (а Г) с).
68 Глава 2. Алгебраические структуры 2.6.2. Ограниченные решетки Если в решетке 20 е МУа 0 П а = 0, то 0 называется нулем (или нижней гранью) решетки. Если в решетке 31eMValUa = l, то 1 называется единицей (или верхней гранью) решетки. Решетка с верхней и нижней гранями называется ограниченной. ТЕОРЕМА Если нижняя (верхняя) грань существует, то она единственна. Доказательство Пусть 0' — еще один нуль решетки. Тогда 0 Л 0' 0' и 0' Л 0|= 0. Следовательно 0 = 0'. □ ТЕОРЕМА а Л b = b <==> a U b = а. Доказательство ==>: Пусть а Л Ъ — Ъ. Тогда a U b = a U (а Л Ь) = (а Л b) U а = а. ф=: Пусть a U Ъ = а. Тогда а Л b = (a U Ь) Л b = (bUa) Л b = b. О СЛЕДСТВИЕ 0 Л а = 0 <==> 0 U а = а, 1 U а = 1 <==> 1 Л а = а. 2.6.3. Решетка с дополнением В ограниченной решетке элемент а1 называется дополнением элемента а, если а Л а' = 0 и a U а' = 1. Если Vа е М За' € М аС\а' = 0&aUa' = 1, то ограниченная решетка называется решеткой с дополнением. Вообще говоря, дополнение не обязано существовать и не обязано быть единственным. ТЕОРЕМА (о свойствах дополнения) В ограниченной дистрибутивной решетке с дополнением выполняется следующее: 1. дополнение а' единственно; 2. дополнение инволютивно: а” = а; 3. грани дополняют друг друга: 1' = 0, 0' = 1; 4. выполняются законы де Моргана: (a U Ь)' = а' Л У, (а Л У)' = а' U У. Доказательство 1. Пусть х, у — дополнения а. Тогда аП i = 0, а U ж = 1, а Л у = 0, aUy = 1. Имеем: (х = х Л 1 = х Л (а U у) = (х Л а) U (ж Л у) = 0 U (ж Л у) = ж Л у, у = уЛ1 = уЛ(аиж) = (уЛа)и(уЛж)=0и(уЛж) = уЛж = жЛу) => ж = у. 2. (а U а' = 1 => a' U а = 1, а Л а' — 0 ==> а' Л а = 0) => а — а".
2.6. Решетки 69 3. (1П0 = 0,0'П0 = 0) => 1 = 0', (10 0 = = 1) =>o = r. 4. (а П b) П (a' U b') = (a Q b Оa') U (aП b П b'} = (0 П b) U (a П 0) = OUO = 0, (aП 6) U (a'U £>') - (aU a! U У) П (У Ua' U£>') = (1U У) П (1 Ua') = 1 П 1 = 1. □ 2.6.4. Частичный порядок в решетке В любой решетке можно естественным образом ввести нестрогий частичный по- рядок, а именно: а ^Ъ: = аС\Ь = а. ТЕОРЕМА Пусть a -<b: — а nd = а. Тогда -< является отношением частичного порядка. Доказательство 1. Рефлексивность: а П а = а ==> а -< а. 2. Антисимметричность: а -< £>& b -< а => aC\b — a&cbC\a = b =» а = а Л Ь = = b О а = Ь. 3. Транзитивность: а -< b & b -< с ==> anb = a&bnc = b => а П с — (а П 6) П с =. = а П (ЬС\ с) = а П b = а => а -< с. □ Наличие частичного порядка в решетке не случайно, это ее характеристическое свойство. Более того, обычно решетку определяют, начиная с частичного порядка, следующим образом. Пусть М — частично упорядоченное множество с частичным порядком Эле- мент х называется нижней границей для а и Ь, если х -< а & х -< Ь. Аналогично у называется верхней границей для а и Ь, если а -< у & b -< у. Элемент х называется нижней гранью (наибольшей нижней границей) элементов а и Ь, если х — нижняя граница элементов а и b и для любой другой нижней границы v элементов а и b v -< х. Обозначение: х = inf(a, 6). Аналогично, у на- зывается верхней гранью (наименьшей верхней границей) элементов а и Ь, если у — верхняя граница элементов а и b и для любой другой верхней границы и элементов а и b у -< и. Обозначение: у = sup(a, b). ТЕОРЕМА Если нижняя (верхняя) грань существует, то она единственна. Доказательство х = inf (а, 6) & у = inf (а, Ь) => у -< х & х -< у => х = у. □ ТЕОРЕМА Если в частично упорядоченном множестве для любых двух элемен- тов существуют нижняя и верхняя грани, то это множество образует решетку относительно inf и sup (то есть х П у: = inf (х, у), х U у: = sup(a:, у)).
70 Глава 2. Алгебраические структуры Доказательство 1. inf (ж, х) = х => х Л х = х, sup(a:, х) = х => х U х = х‘, 2. inf(x,y) — inf(y,x) => хС\у = уС\х, sup(a:,y) = sup(y,a:) => xUy = у Us; 3. inf (ж, inf (у, z)) = inf (inf (ж, у), z) =Ф x Л (у П z) = (ж Л у) П z, sup (ж, sup(y, z)) = sup(sup(a:, у), z) =$• x U (y U z) = {x U y) U z; 4. sup(inf (a, b), a) = a => (a Л b) U a = a, inf(sup(a, b),a) — a => (a U b) Л a = a. □ 2.6.5. Булевы алгебры Дистрибутивная ограниченная решетка, в которой для каждого элемента суще- ствует дополнение, называется булевой алгеброй. Свойства булевой алгебры: 1. a U a = а, по определению решетки; а Л а = а 2. a U b = b U а, по определению решетки; аПЬ — bCia 3. qU (bUc) = (aUb)Uc, по определению решетки; а Л (ЬП с) = (а ЛЬ) Л с 4. (а Л b) U а — а, по определению решетки; (a U Ь) П а = а 5. a U (Ь Л с) = (a U Ь) Л (a U с), по свойству дистрибутивности; аГ\(Ьис) = (а Л b) U Л с) 6. aUl = 1, по свойству ограниченности; аЛО = 0 7. а U 0 = а, по следствию из теоремы ограниченности; а Л1 = а 8. а" = а по теореме о свойствах дополнения; 9. (а Л b)' = a' U V, по теореме о свойствах дополнения; (a U by = а' ПЬ' 10. aUa' = 1, аПа' = 0 так как дополнение существует. Пример 1. (2м; Л, и,- ) — булева алгебра, 1 = U, 0 = 0, -<=с. 2. (Е2;V, ->) — булева алгебра, 1 = 1, 0 = 1, -<===>.
2.7. Матроиды 71 3. Пусть тг(р) : = {g|geN&g — простое & q р} — множество простых чисел, не превосходящих р, Р(р): = < п | п = т > — пг€Л/С7г(р) множество произведений различных чисел из л(р). Тогда (Р; Н.О.Д., Н.О.К., ДОП) — булева алгебра, где Н.О.Д. — наибольший общий делитель, Н.О.К. — наименьшее общее кратное, ДОП(п): = — ГТ д. п , qG5t(p) 1: = q, 0: = 1, т -< п-. — п делится на т. 2.7. Матроиды Матроиды, рассматриваемые в этом разделе, вообще говоря, не являются алге- браическими структурами в том смысле, который был придан этому понятию в первом разделе данной главы. Однако, во-первых, матроиды имеют много об- щего с рассмотренными алгебраическими структурами (в частности, с линейно независимыми множествами в векторных пространствах) и изучаются сходными методами, а во-вторых, они являются теоретической основой для изучения и' ана- лиза «жадных» алгоритмов; Ясное понимание природы и области применимости жадных алгоритмов совершенно необходимо всякому программисту. 2.7.1. Определения Матроидом М = (Е, £) называется конечное множество Е, |Е| = п и семейство его подмножеств £ с 2Е, такое что выполняются следующие три аксиомы: Ml: 0 е £; М2- М3: А,В G £ & |В| = |А| + 1 => Эе € В \ A AU {е} € £. Элементы множества £ называются независимыми, а остальные подмножества Е (2Б \ £) — зависимыми множествами. ЗАМЕЧАНИЕ-------------------------------------------------------- Аксиома М\ исключает из рассмотрения вырожденный случай 6 = 0. Пример Семейство линейно независимых множеств векторов любого векторного про- странства является матроидом. Действительно, по определению можно считать,
72 Глава 2. Алгебраические структуры что пустое множество линейно независимо. Всякое подмножество линейно не- зависимого множества векторов линейно независимо. Пусть А: ={а1;..., ат} и В: —{bi,..., Ьт+1} — линейно независимые множества. Если бы все векторы из множества В выражались в виде линейной комбинации векторов из множества А, то множество В было бы линейно зависимым. Стало быть, среди векторов множества В есть по крайней мере один вектор Ь, который не входит в множе- ство Л и не выражается в виде линейной комбинации векторов из множества А. Добавление вектора b к множеству А образует линейно независимое множество. ЗАМЕЧАНИЕ------------------------------------------------------ Само понятие матроида возникло в результате исследований линейной независимости в векторных пространствах. 2.7.2. Максимальные независимые подмножества Пусть X с Е — произвольное множество. Максимальным независимым подмно- жеством множества X называется множество У, такое что У СХ&У GE&VZGE Z С X =* Z cY. Множество максимальных независимых подмножеств множества X обозначим X. Рассмотрим следующее утверждение: М4: XX (Y eX&Z eX=*\Y\ = ]Z\), то есть максимальные независимые подмножества данного множества равно- мощны. ТЕОРЕМА Пусть М = {Е, Е) и выполнены аксиомы и М2- Тогда аксиома Мз и утверждение М4 эквивалентны, то есть |В| = IД| + 1 ==» Эе 6 В\ A A U {е} б Е) тогда и только тогда, когда 'i X (Y,Z ех=»|У| = |2|). Доказательство Необходимость. Пусть выполнены утверждения Mi, М2, Мз (то есть М — матро- ид). Покажем от противного, что выполняется и М4. Пусть У, Z е X, ]У| / |Z| и для определенности |У| > \Z\. Возьмем У' с У, так что |У'| = \Z\ + 1. Тогда по свойству Мз имеем: BeeY'\ZW: = ZU {е} 6 Е. Таким образом, имеем W б 8, Z с W, W С X, что противоречит предположению Z б X. Достаточность. Пусть выполнены утверждения Mi, М2, М4. Покажем от против- ного, что выполняется и М3. Возьмем А, В б 8, так что |В| = |Д| + 1. Допустим, что -de б В\А Ди{е} б 8, то есть Ve 6 В\Д Ди{е} £. Рассмотрим С: = АиВ. Имеем А € С. Но В е Е, поэтому Э В' В С В' & В' б 8 & В' б С. По условию М4 имеем |В'| = |А|. Но |Д| = |В'| > |В| = |Д| +1 — противоречие. □
2.7. Матроиды 73 ЗАМЕЧАНИЕ-------------------------------------------------------~ Таким образом, Mi, М2, Mt — эквивалентная система аксиом матроида. 2.7.3. Базисы Максимальные независимые подмножества множества Е называются базами, или базисами, матроида М = {Е, £). Всякий матроид имеет базисы, что видно из следующего алгоритма. Алгоритм 2.1. Алгоритм построения базиса матроида Вход: Матроид М = {Е,Е). Выход: Множества В С Е элементов, образующих базис. В: — 0 { вначале базис пуст } for е 6 Е do if В U {е} е б then В: == В 6 {е} { расширяем базис допустимым образом } end if end for Обоснование Алгоритм вычисляет базу матроида М. Действительно, пусть Во = 0, Bi,...,Bk = В — последовательность значе- ний переменной В в процессе работы алгоритма. По построению 'ii Bi е £. Пусть В £ Е, то есть В не является максимальным. Тогда ЗВ' В сВ'кВ' / В & В' е Е Возьмем В" с В', так что |В"| = )В| + 1, В с В” и В" е £. Рассмотрим е 6 В' \ В. Элемент е не попал в множество В, но алгоритм про- сматривает все элементы, значит, элемент е был отвергнут на некотором шаге г, то есть (Z?i-i U {е}) ^ £. Но е 6 В" & В^ с В" => (Bt-i U {е}) е £. По аксиоме М2 имеем: U {е}) 6 £ — противоречие. □ СЛЕДСТВИЕ Все базы матроида равномощны. 2.7.4. Ранг Мощность максимального независимого подмножества данного множества X на- зывается рангом множества: г(Х):= max |А|. ’ АсХ&Ае£ ЗАМЕЧАНИЕ-----------------------------------------------------—------ Это определение корректно, потому что все максимальные независимые подмножества данного множества равномощны. ЛЕММА Хе£&У = Доказательство Хс X&XeE&Y С X=*X = Y. □
74 Глава 2. Алгебраические структуры ТЕОРЕМА X б £ «=> г(Х) = |Х|. Доказательство X е£<=^(Х 6 £&У eX=^X = Y)<=^ (г(х) = |Х|). ТЕОРЕМА У А, В С KVe1,e2 б Е Ri : 0 < г(Л) < |Л| R2 : А < В ==> г(Л) г(В) 7?з : г(Л U В) + г(А И В) < г(Л) + т(В) R1 : г(Л) г(Л U {е}) < г(Л) + 1 R5 : г(Л U {ег}) = г(Л U {е2}) = г(Л) => г(Л U {ej, е2}) = г(Л) Доказательство Ri : очевидно; R2 : очевидно; 7?з : Пусть {ei,..., е,} б Л О В. Тогда {ei,... ,dj} б Л и затем {вх,. ,dj,a,..., Cfc} б А Г} В. Имеем г = г(Л П В), B'+i == г(Л), i+fc<i + j4-fc = г(Л U В) ==> г(Л U В) + т(Л П В) = (г + j + fc) + i = = (г + j) + (г + k) т(Л) + г(В); Ri : очевидно; Rs : г(Л) г(Л U {е!,е2}) = г(Л U {ej.} U {е2}) г(Л U {ei}) + г(Л U {е2}) — -г^(Л U {ej}) П (Ли {е2})) = г(Л) + г(Л) - г(Л) = г(Л). □ 2.7.5. Жадный алгоритм Пусть имеются конечное множество В,/|£'| = п, весовая функция w: Е -> R+ и семейство £ С2В. Рассмотрим следующую задачу: найти X е £, такое что w(X) = maxw(Y), гдеш(2):= w(e). Уе£ eSZcE Другими словами, необходимо выбрать в указанном семействе подможество наи- большего веса. Не ограничивая общности, можно считать, что w(ei) - ш(еп) > 0. Рассмотрим следующий алгоритм. Алгоритм 2.2. Жадный алгоритм Вход: множество Е = {ei,... ,еп}, семейство его подмножеств £ и весовая функция w. Множество Е упорядочено в порядке убывания весов элементов. Выход: подмножество X.
2.7. Матроиды 75 X: = 0 { вначале множество X пусто } for г from 1 to п do if X U {е,} G £ then X: = Х U {е<} { добавляем в X первый подходящий элемент } end if end for Алгоритм такого типа называется жадным. Соверешенно очевидно, что по по- строению окончательное множество X 6 £. Также очевидно, что жадный алго- ритм является чрезвычайно эффективным: количество шагов составляет О(п), то есть жадный алгоритм является линейным. (Не считая затрат на сортировку множества Е и проверку независимости XU{ej € £.) Возникает вопрос: в каких случаях жадный алгоритм действительно решает задачу, поставленную в начале раздела? Пример Пусть дана матрица 7 5 1 3 4 3 2 3 1 Рассмотрим следующие задачи. 1. Выбрать по одному элементу из каждого столбца, так чтобы их сумма бы- ла максимальна. Нетрудно видеть, что жадный алгоритм выберет следующие элементы: 0 0 1 з 4 0 2 3 1 которые действительно являются решением задачи. 2. Выбрать по одному элементу из каждого столбца и из каждой строки, так чтобы их сумма была максимальна. Нетрудно видеть, что жадный алгоритм выберет следующие элементы: 0 Д 1 з Щ з 2 3 0 которые не являются решением задачи, поскольку существует лучшее реше- ние: 0 5 1 3 4 0 2 0 1 ТЕОРЕМА Если М — {Е, £) — матроид, то для любой функции w жадный алго- ритм находит независимое множество X с наибольшим весом; если же М — {Е, £) не является матроидом, то существует такая функция w, что множество X, найденное жадным алгоритмом, не будет максимальным.
76 Глава 2. Алгебраические структуры Доказательство Пусть М = (Е, 8) — матроид, и пусть X = {х1;... ,хк} — множество, построенное жадным алгоритмом. По построению ш(хг) > •• • > wfak) > 0. Согласно алгорит- му 2.1, X — база М. Пусть теперь Y = {yi,..., ут} € 8. — некоторое независимое множество. Имеем т < к, так как X — база. Покажем, что < w(xi). От противного. Пусть w(yi) > w(xi). Рассмотрим независимые множества А = {ж1, • ,«,-!} и В = {yi,...,yi_i,yi}. Имеем 3J i {xlt... ,x^1?yj} — независимое множество. Тогда w(y,) > w(yi) > w(xi) ==> Зр i Ш(Ж1) > w(yj) w(Xp), что противоречит тому, что хр — элемент с наибольшим весом, добавление кото- рого к {xi,..., 1} не нарушает независимости. Следовательно, Vi w(pj) < w(a:j) =Фш(У)^ w(X) Обратно. Пусть М = {Е-, 8) не является матроидом. Если нарушено условие М2, то есть ЗА, В А С В & £., но А <£ 8, то определим функцию w следующим образом: w(e): = если е е Л; если е ё Е \ А. Тогда А £ 8 => А <£. X => |Х| < |Л|. Если же условие М2 выполнено, но нарушено условие Мз, то(3 А, В |Л| = fc& |В| — к + 1 и Ve е В \ A A U {е} — зависимое. Пусть р: — |Л Г) В|. Тогда р < к. Выберем число е так, что 0 < е < l/(fc — р). Определим функцию w следующим образом: w(e) = < 1, 0, 1 + Е, если е ё Л; если е ё В \ Л; в остальных случаях. Заметим, что при таких весах жадный алгоритм сначала выберет все элементы из Л и отбросит элементы В \ Л. В результате будет выбрано множество X, вес которого меньше веса множества В. Действительно, ш(Х) = го(Л) = fc(l + е) = (fc - р)(1 + е) + р(1 + е) < (к - р)(1 + l/(fc - р)) + р(1 + е) = (fc - р + 1) + р(1 + е) - w(b). □ ЗАМЕЧАНИЕ--------------------------------------------------------------- Тот факт, что семейство 8 является матриодом, означает, что для решения поставленной экстремальной задачи можно применить жадный алгоритм, однако из этого не следует, что не может существовать еще более эффективного алгоритма. С другой стороны, еслй семейство 8 не является матроидом, то это еще не значит, Что жадный алгоритм не найдет правильного решения — все зависит от свойств конкретной функции w.
Комментарии 77 ОТСТУПЛЕНИЕ------------------------------------------------------ Жадные алгоритмы и их свойства были исследованы сравнительно недавно, но их значе- ние в практике программирования чрезвычайно велико. Если удается свести конкретную экстремальную задачу к такой постановке, где множество допустимых вариантов (из ко- торых нужно выбрать наилучший) является матроидом, то в большинстве случаев следует сразу применять жадный алгоритм, поскольку он достаточно эффективен в практическом смысле. Если же, наоборот, оказывается, что множество допустимых вариантов не образу- ет матроида, то это «плохой признак». Скорее всего, данная задача окажется труднореша- емой. В этом случае целесообразно тщательно исследовать задачу для предварительного получения теоретических оценок сложности, чтобы избежать бесплодных попыток «изо- брести» эффективный алгоритм там, где это на самом деле невозможно. 2.7.6. Примеры матроидов Ниже приведены некоторые примеры матроидов, встречающихся в рассмотрен- ных областях дискретной математики. В последних главах книги имеются до- полнительные примеры матроидов, связанных с графами. 1. Свободные матроиды. Если Е — произвольное конечное множество, то М = {Е, 2е) — матроид. Такой матроид называется свободным. В свободном матроиде каждое множество независимое, г(Л) = |Л|. 2. Матроидыразбиений. Пусть {E'i, ..., Ek} — некоторое разбиение множества Е на непустые множества. Другими словами, |Ji=i ^k = Е, Е,(д Ej = 0, Ej 0. Положим £: = {А С Е | |Л П Et\ < 1}, то есть в независимое множество входит не более чем один элемент каждого блока разбиения. Тогда М = {Е, Е) — матроид. Действительно, условие М2 выполнено. Если А, В е Е и |В| = |Л| + 1, то Зг Л Л| = 0& Л В| = 1. Обозначим еЕ, Л В. Тогда Л U {е} 6 Е. Значит, выполнено условие Мз. 3. Векторные пространства. Линейно независимые множества векторов любого векторного пространства образуют матроид. Действительно, условия М± и Mi, очевидно, выполнены для линейно независимых множеств векторов. Условие выполнено по теореме подраздела 2.5.4. 4. Матроид трансверсалей. Пусть Е — некоторое множество, и Е — семейство подмножеств этого множества (не обязательно различных), £ С 2Е. Подмно- жество Л С Е называется частичнаой трансверсалью семейства £, если Л содержит не более чем по одному элементу для каждого подмножества Ei семейства £. Частичные трансверсали над Е образуют матроид (см. [14]). Комментарии Так же как и в предыдущей главе, сведения, изложенные здесь, настолько об- щеизвестны, что конкретные ссылки ниже следует рассматривать как примеры, а не как единственно рекомендуемые источники. Конкретные алгебраические
78 Глава 2. Алгебраические структуры структуры разделов 2.3-2.6 описаны в [10, 12, 22]. Книги [22] и [12] могут быть использованы как введение в общую алгебру (разделы 2.1-2.2); первая из них вполне элементарна. Монография [3] исчерпывающим образом освещает важные для приложений вопросы, бегло затронутые в подразделе 2.6.5. Особого внима- ния заслуживает материал последнего раздела главы, который (с некоторыми сокращениями) следует книге [14]. Упражнения 2.1. Является ли группа целых чисел (Z;+) конечно-порожденной? Какова ее система образующих? 2.2. Пусть А: — (A; f) иЪ: = (В; д} — две алгебры типа (2). Тогда алгебра 6: = (С; h) называется прямым произведением алгебр А и 3 (и обозначается 6:=Л х ®), если С = А х В и операция h: С х С -> С определена следующим образом: /г((«1, Ь1)(а2, Ьг)) а2), д(Ьг, 62)). Пусть Ъ:=А х А. Доказать, что существуют гомоморфизмы а: Л —> ® и /?: Ъ -> А, такие что а о /?; А -> А — тождественная функция. 2.3. Пусть L: — {ах + b | a, b & Ж} — множество линейных функций. Операция линейной замены переменной определяется следующим образом: (ах + 6) о (ex + d): =(а(сх + d) + 6) = (acjx + (ad + 6)). Доказать, что множество линейных функций образует группу относительно линейной замены переменной. 2.4. Пусть на множестве пар вещественных чисел Ж2 определены операции ф,®: Ж2 х Ж2 -> К2 следующим образом: (а, Ь) ф (с, d): =(а + с, b + d) и (а, 6) ® (с, d): =(ас, bd). Доказать, что X: — (Ж2; ф, ®) образует коммутативное кольцо. 2.5. Поле X: = (F‘, +, ) называется упорядоченным, если существует такое под- множество Р носителя F, что для любого элемента х е F выполняется одно и только одно из следующих трех утверждений: х ё Р \ {0}, х — 0 или —х 6 Р \ {0}. Определим отношение < на упорядоченном поле следующим образом: а b : — b — а £ Р. Доказать, что < является отношением порядка на F. 2.6. Доказать, что в решетке из взаимного поглощения следует идемпотентность обеих операций. 2.7. Доказать, что семейство Ъ С 2е является базой некоторого матроида над Е тогда и только тогда, когда VBi,B2 е® eeBr\B2 =^3feB2\B1 (В^ \ {е} U {/}) ё £.
ГЛАВА 3 Булевы функции Данная глава имеет двойное назначение. С одной стороны, это развернутый при- мер к предыдущей главе в том смысле, что здесь демонстрируются эффектив- ность и действенность алгебраических методов. Помимо основных фактов из теории булевых функций здесь затрагиваются весьма общие понятия, такие как реализация функций формулами, нормальные формы, двойственность, полнота. Эти понятия затруднительно описать исчерпывающим образом на выбранном элементарном уровне изложения, но знакомство с ними необходимо. Поэтому рассматриваются частные случаи указанных понятий на простейшем примере бу- левых функций. С другой стороны, материал этой главы служит для «накопления фактов», которые должны создать у читателя необходимый эффект «узнавания знакомого» при изучении довольно абстрактного и формального материала сле- дующей главы. 3.1. Элементарные булевы функции Подобно тому как в классической математике знакомство с основами анализа Начинают с изучения элементарных функций (sin, log и т. д.), так и изложение теории булевых функций естественно начать с выделения, идентификации и из- учения элементарных булевых функций (дизъюнкция, конъюнкция и т. д.). 3.1.1. Функции алгебры логики Функции f-.E?-) Е-2, где Е2.={0,1}, называются функциями алгебры логики, или булевыми функциями, по имени Дж. Буля1. Множество булевых функций от п переменных обозначим Рп, Рп ~{f | /: Е% -> Е2}. Булеву функцию от п переменных можно задать таблицей истинности: 1G. Boole (1815-1864)
80 Глава 3. Булевы функции ®1, .. Жп • • уЭС-п) 0 0 0 0 0 1 0 1 0 1 1 1 Если число переменных п, то в таблице истинности имеется 2П строк, соответ- ствующих всем различным комбинациям значений переменных, которым мож- но сопоставить 22" различных столбцов, соответствующих различным функциям. Таким образом, число булевых функций от п переменных с ростом п растет весь- ма быстро: |Рп| = 22” 3.1.2. Существенные и несущественные переменные Булева функция / 6 Рп существенно зависит от переменной xit если существует такой набор значений ,..., сц_ i, ai+1,..., ап, что /(«1, ,«£-!,О,ai+i. ,an) //(ai,... ,aj_i, l,ai+i, ,an). В этом случае xt называют существенной переменной, в противном случае Х{ называют несущественной (фиктивной) переменной. Пример Пусть булевы функции fi(x1,x2) и /2(a:i,х2) заданы следующей таблицей ис- тинности: Х2 /1 /2 0 0 0 1 1 0 1 1 0 0 1 1 1 1 0 Для этих функций переменная хг — существенная, а переменная х2 несуще- ственная. По определению булевы функции равны, если одна из другой получается введе- нием (или удалением) несущественных переменных. Всюду в дальнейшем буле- вы функции рассматриваются с точностью до несущественных переменных. Это позволяет считать, что все булевы функции (в данной системе функций) зависят от одних и тех же переменных.
3.2, Формулы 81 3.1.3. Булевы функции одной переменной Переменная х 0 1 Название Обозначение Фиктивные нуль 0 0 0 X тождественная X 0 1 отрицание ~ХЕ, X, X 1 0 единица 1 1 1 X 3.1.4. Булевы функции двух переменных Переменная х 0 0 1 1 Переменная у 0 1 0 1 Название Обозначение Фиктивные нуль 0 0 0 0 0 х, у конъюнкция •> &:> Л 0 0 0 1 0 0 1 0 0 0 1 1 У 0 1 0 0 0 1 0 1 X сложение по модулю 2 -И Ф, д 0 1 1 0 дизъюнкция V 0 1 1 1 стрелка Пирса 4. 1 0 0 0 эквивалентность = 1 0 0 1 1 0 1 0 X 1 0 1 1 1 1 0 0 У импликация =>, Э 1 1 0 1 штрих Шеффера I 1 1 1 0 единица 1 1 1 1 1 х,у 3.2. Формулы В этом разделе обсуждается целый ряд важных понятий, которые часто счита- ются самоочевидными, а потому их объяснение опускается. Такими понятиями являются, в частности, реализация функций формулами, интерпретация фор- мул для вычисления значений функций, равносильность формул, подстановка и замена в формулах. Между тем программная реализация работы с формулами требует учета некоторых тонкостей, связанных с данными понятиями, которые целесообразно явно указать и обсудить.
82 Глава 3. Булевы функции 3.2.1. Реализация функций формулами Пусть F = {/i,... ,fm} — множество булевых функций. Формулой над ^..назы- вается выражение вида где f е F и ti либо переменная, либо формула над F. Множество F называется базисом, функция f называется главной (внешней) операцией (функцией), а tf называются подформулами. ЗАМЕЧАНИЕ-------------------------------------------------------- Обычно для элементарных булевых функций используется инфиксная форма.',записи, устанавливается приоритет (->, &, V, —>) и лишние скобки опускаются Всякой формуле S' однозначно соответствует некоторая функция /. Это соответ- ствие задается алгоритмом интерпретации, который позволяет вычислить зна- чение формулы при заданных значениях переменных. Алгоритм 3.1. Алгоритм интерпретации формул — рекурсивная функция Eval Вход: формула S, множество функций базиса F, значения переменных ац,... ,хп. Выход: значение формулы S на значениях xi,...,xn, или значение fail, если значение не может быть определено. if S = 'х/ then return Xi { значение переменной задано } end if if S = .,tn)' then if / 0 F then return fail { функция не входит в базис } end if for t € {ti,... ,tn} do y, : = Eval (ti, F, хг,..., xn) { значение г-го аргумента } end for return f(yi,..., yn) { значение главной операции, примененной к значениям аргумен- тов } end if return fail { это не формула } ОТСТУПЛЕНИЕ----------------------------------------------- Некоторые программистские замечания по поводу процедуры Eval. 1. При программной реализации алгоритма интерпретации формул важно учитывать, что в общем случае результат вычисления значения формулы может быть не определен (fail). Это имеет место, если формула построена синтаксически неправильно или если в ней используются функции (операции), способ вычисления которых не задан, тб есть они не входят в базис. Таким образом, необходимо либо проверять правильность фор- мулы до начала работы алгоритма интерпретации, либо предусматривать невозмож- ность вычисления значения в самом алгоритме.
3.2. Формулы 83 2. Это не единственный возможный алгоритм вычисления значения формулы, более то- го, он не самый лучший. Для конкретных классов формул, например, для некоторых классов формул, реализующих булевы функции, известны более эффективные алго- ритмы. 3. Сама идея этого алгоритма: «сначала вычисляются значения аргументов, а потом зна- чение функции», не является догмой. Например, можно построить такой алгоритм интерпретации, который вычисляет значения только некоторых аргументов, а потом вычисляет значение формулы, в результате чего получается новая формула, реали- зующая функцию, которая зависит от меньшего числа аргументов. Такой алгоритм интерпретации называется смешанными вычислениями. 4. Порядок вычисления аргументов считается неопределенным, то есть предполагается, что базисные функции не имеют побочных эффектов. Если же базисные функции име- ют побочные эффекты, то результат вычисления значения функции может зависеть от порядка вычисления значений аргументов. Если формула Д' и базис F заданы (причем У является правильно построенной формулой над базисом F), то процедура Eval(3", F, xj,..., хп) является некоторой булевой функций / переменных xi,... ,хп. В этом случае говорят, что формула У реализует функцию /: func Д = f. ЗАМЕЧАНИЕ-------------------------------------------------------— Для обозначения реализуемости применяют и другие приемы. Выбранное обозначение обладает тем достоинством, что не путается с другими обозначениями в книге. Зная таблицы истинности для функций базиса, можно вычислить таблицу ис- тинности той функции, которую реализует данная формула. Пример 1. Fi: =(xi Л х2) V ((xi Л х2) V (xi Л х2)) Х1 £2 XI /\х2 ЯД ЛХ2 (xi Л aj2) V (яд Л х2) xi Лх2 Fi 0 0 0. 0 0 0 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 1 1 Таким образом, формула Fi реализует дизъюнкцию. 2. F2 : =(xi Л х2) —» xi ац х2 xi Лжг f2 0 0 0 1 0 1 0 1 1 0 0 1 1 1 1 1
84 Глава 3. Булевы функции Таким образом, формула F2 реализует константу 1. 3. F3 : =((®i Л х2) + £1) + а:2 XI Х2 xi Л х2 (xi Ли) +asi ((Х1 Л Х2) + Я1) + х2 0 0 0 0 0 0 1 0 0 п 1 1 0 0 1 1 1 1 1 0 1 Таким образом, формула F3 также реализует дизъюнкцию. 3.2.2. Равносильные формулы Одна функция может иметь множество реализаций (над данным базисом). Фор- мулы, реализующие одну и ту же функцию, называются равносильными: З) — $2 ' = func 31 = f & func Т2 = f. Отношение равносильности формул является эквивалентностью. Имеют место следующие равносильности: 1. а V а = а, 2. а V b — b V а, 3. а V (b V с) = (а V b) V с, 4. (а Л b) V а = а, 5. а V (Ь Л с) = (а V Ь) Л (а V с), 6. а V 1 = 1, 7. а V 0 = а, 8. -п->а — а; 9. -i(a Л b) — ->а V -уЪ, 10. а V -па = 1, а Л а = а; а Л b = b Л а; а Л (Ь Л с) = (а Л Ь) Л с; (а V Ь) Л а = а; а Л (b V с) — (а Л b) V (а Л с); а Л 0 = 0; а Л 1 = а; -п(а V b) = ->а Л -Ь; а Л -па = 0. Все они могут быть проверены построением соответствующих таблиц истинно- сти. Таким образом, <£72; V, Л, —) — булева алгебра. 3.2.3. Подстановка и замена Если в формулу Т входит переменная х, то это обстоятельство обозначается так: 3"(. • • х...). Соответственно, запись Э"(... S • • ) обозначает, что в формулу 3 вхо- дит подформула S. Вместо подформулы (в частности, вместо переменной) в фор- мулу можно подставить другую формулу (в частности, переменную), в результате чего получится новая правильно построенная формула. Если подстановка про- изводится вместо всех вхождений заменяемой переменной (или подформулы), то результат подстановки обозначается следующим образом: 3\...х...){д//х}.
3.2. формулы 85 Если же подстановка производится вместо некоторых вхождений (в том чи- сле вместо одного), то результат подстановки обозначается следующим образом: Я--31 ...KS2/S1}. Пример 1. Замена всех вхождений переменной: х V ->х{у Л zj/х} = (у /\z)'V ->(у Л z); 2. Замена всех вхождений подформулы: х\/ у V z{->x//у V z} = х V ->а:; 3. Замена первого вхождения переменной: х V -*х{у/х} = у V -*х; 4. Замена первого вхождения подформулы: ж V у V z{-<x/y V z} = х V -,х. Правило подстановки-, если в равносильных формулах вместо всех вхождений некоторой переменной х подставить одну и ту же формулу, то получатся равно- сильные формулы: v g (£(... х....) = у2(... х.) => (... х... ){9//4 = у2(... х... ){д//4). ЗАМЕЧАНИЕ----------------------—------------------------------------- В правиле подстановки условие замены всех вхождений существенно: например, xV-ix = 1 и х V ~<х = 1{у//х} = у V = 1, но а: V -^{у/х} = у V -*х / 1! Правило замены: если в формуле заменить некоторую подформулу на равносиль- ную, то получится равносильная формула: vj(...g!...) 9i = 92=>y(...9i...) = y(...g1...){g2/gi}. Пусть F = {/1,..., fm} и G = {pi,... ,дт}. Тогда говорят, что формулы и 9[G] имеют одинаковое строение, если Т совпадает с результатами подстановки в формулу 9 функций fi вместо функций р»: T[F] = двдж. 3.2.4. Алгебра булевых функций Булевы функции V, Л, -> (и любые другие) являются операциями на множестве булевых функций У,Л: Рп х Рп -+Рп, Рп-+ Рп- Действительно, пусть формулы 3) и Т2 равносильны и реализуют функцию /, а формулы 91 и 92 равносильны и реализуют функцию д: f\inc3\ = f, funcT2 = /, func9i=p, func92 = g. Тогда, применяя правило замены нужное число раз, имеем: Ti v 91 = т2 v д2, 71 л 91 = т2 л g2, -i£Fi = -<f2. Таким образом, если взять любые формулы J и 9, реализующие функции f и д, соответственно, то каждая из формул 3" Л 9, 7 V 9 и У реализует одну и ту же функцию, независимо от выбора реализующих формул У и 9. Следовательно,
86 Глава 3. Булевы функции функции, которые реализуются соответствующими формулами, можно по опре- делению считать результатами применения соответствующих операций. Другими словами, если func S' = /, func S = g, то / A5: = func(J A 3); f Vg: = func(SV 3), =func(-.J) Алгебраическая структура (Pn; V, A, -,) называется алгеброй булевых функций. Ал- гебра булевых функций является булевой алгеброй. Действительно, пусть рав- носильности, перечисленные в подразделе 3.2.2, проверены путем построения таблиц истинности. Ясно, что эти таблицы не зависят от того, откуда Взялись значения а, Ь, с. Таким образом, вместо а, Ь, с можно подставить любые функ- ции, а значит, любые реализующие их формулы, если только выполнено прави- ло подстановки. Таким образом, аксиомы булевой алгебры выполнены в алгебре <Pn;v,A,-). Пусть [S'] — множество формул, равносильных S' (то есть класс эквивалентности по отношению равносильности). Рассмотрим множество X классов эквивалент- ности по отношению равносильности X: ={[S]}y. Пусть операции V, А: ЭС х ЭС —> ЭС, ^:ЭС->ЭС определены (на множестве классов эквивалентности формул по отношению рав- носильности) следующим образом: [?1] V [Т2]: =[Ji V Т2], [ЭД А [Д2]: =[^ Л Т2], : =[--J2] Тогда алгебра классов равносильных формул (X; А, V, -,) {алгебра Линденбаума- Тарского) изоморфна алгебре булевых функций и является булевой алгеброй. (Носитель этой алгебры — множество классов формул.) ОТСТУПЛЕНИЕ------------------------------------------------------------ На практике мы говорим о функциях, а пишем формулы, хотя формулы и функции — раз- ные вещи. Например, формул бесконечно много, а функций только конечное число, и сво- бодная алгебра формул не изоморфна алгебре функций. Но алгебра функций изоморфна алгебре классов равносильных формул, что позволяет манипулировать формулами, имея в виду функции. 3.3. Принцип двойственности Пусть f{xi,..., хп) е Рп — булева функция. Тогда функция /* (х^,жп)у опре- деленная следующим образом: f (a^i,..., ajn) • ~ f(?Ci j • • •, In)> называется двойственной к функции /. Из определения видно, что двойствен- ность инволютивна: /** = /.
3.3. Принцип двойственности 87 Пример Двойственные функции: f 1 0 Xi V Х2 Х1 Л Х2 X X Г 0 1 XI Л Х2 Xl V Х2 X X Функция называется самодвойственной, если /* = /. Пример Тождественная функция и отрицание самодвойственны, а дизъюнкция и конъ- юнкция — нет. ЗАМЕЧАНИЕ------------------------------------------------------- Далее используется обозначение: /(•••): = /(•••). ТЕОРЕМА Если функция ч>(х\хп) реализована формулой f (/1 (*^1 > • • • 7 З'п)} • • • 7 fntZ'l 7 • ‘ ’ 7 ^п))? то формула , хп),f*(Xi, ... ,ж„)) реализует функцию <p*(xi,...,хп). Доказательство <p*(xi,...,xn) =1р(х1,...,хп) = . ,хп),. . ., fn(xi,. . . ,£„)) = = 7(71 (Zl, • . . ,Zn), , (7n(®17 . . . ,Zn)) = = 7(71*(®1, • • • 7®n), • • ,7п*(®1. • • • 7®n)) = = • • • ,xn),..., .. ,xn)). □ ТЕОРЕМА (Принцип двойственности) Пусть F = {/i,..., fm}- Положим F* /*m}. Тогда если формула над базисом F реализует функцию f, то формула Т* над базисом F*, полученная из формулы S' заменой функций fi на двойственные функции f*, реализует функцию f*: funcT[F] = f ==► funcT*[F‘] = /*, где T*[F*]: = ?[F]{/;///• }™i. Доказательство Индукция по структуре формулы Эг. База: если формула Т имеет вид ••• 7 где f е F, то формула Т* = /*(xi,..., хп) реализует функцию /* по определе- нию. Индукционный переход по предыдущей теореме. □
88 Глава 3. Булевы функции ОТСТУПЛЕНИЕ--------------------------------------------------------------- Хорошо известен принцип математической индукции для натуральных чисел: (Р(1)&(Р(п) => Р(п +1))) =* Vn е N Р(п). Этот принцип является справедливым и для других множеств, упорядоченных более сложным образом, нежели натуральные числа. Например, в доказательстве предыдущей теоремы был использован принцип математической индукции в следующей форме. Пусть задана некоторая иерархия (ориентированное дерево). Тогда если 1. некоторое утверждение Р справедливо для всех узлов иерархии нижнего уровня (ли- стьев дерева) и 2. из того, что утверждение Р справедливо для всех узлов, подчиненных данному узлу, следует, что утверждение Р справедливо для данного узла, то утверждение Р справедливо для всех узлов иерархии (дерева). СЛЕДСТВИЕ Ji = У2 =4- ?i* = 32*. Пример Из хг А х2 = x-l V ж2 по принципу двойственности сразу имеем хг V х2 = Xi А ж2. 3.4. Нормальные формы В данном разделе на примере булевых функций обсуждается важное понятие «нормальной формы», то есть синтаксически однозначного способа записи фор- мулы, реализующей заданную функцию. 3.4.1. Разложение булевых функций по переменным Пусть ху : = х • у V х • у (здесь • обозначает конъюнкцию). Очевидно, что (х, у = 0, [1, х = у, = < ху = < xv = х = у. (ж, у = 1, 10, х / у, ТЕОРЕМА (О разложении булевой функции по переменным) f(xi , • • • 5 > З'п) — = Xj1 А • • • А Л , (Tmj где дизъюнкция берется no всем возможным наборам (ai,..., <7m).
3.4. Нормальные формы 89 Доказательство ( 1 А • • • A A f (<Ti,...,(Тщ,Xm-f-i,...,a:n))(ai,...,an) = = V af1 A---Aa^m A/(<71,...,<rm,am+i,...,an) = dj1 A • • • A <Zn” A f(ai,. • • , Ornj ^m+l, • • • , ®n) = » ®n)- О ЗАМЕЧАНИЕ--------------------------------------------------------------------- Здесь доказывается, что некоторая формула реализует заданную функцию.-Для этого до- статочно взять произвольный набор значений аргументов функции, вычислить на этом наборе значение формулы, и если оно окажется равным значению функции на этом на- боре аргументов, то из этого следует доказываемое утверждение. СЛЕДСТВИЕ f (Я-1 > • • •, *^n—1 > 3-п) — •Еп А /(Д-1, ••• , 3-n—l j 1) V Хп A f (xi, . . ., Жп—1 ? 0). СЛЕДСТВИЕ f(x1,...,xn)= У A---A<" A-/(ai,...,an). /(<Г1,...,<Г„)=1 3.4.2. Совершенные нормальные формы Представление булевой функции f(%i,хп) в виде У х°1 А • • • А называется совершенной дизъюнктивной нормальной формой (СДНФ). ЗАМЕЧАНИЕ------------------------------------------------------------- СДНФ называется совершенной, потому что каждое слагаемое в дизъюнкции включает все переменные; дизъюнктивной, потому что главная операция — дизъюнкция, а почему она называется нормальной, объяснено в следующем отступлении. ТЕОРЕМА Всякая булева функция (кроме 0) имеет единственную СДНФ. Доказательство f{x1,...,xn) = у А • • А А/(от,..., <тп) =? 0^1,<тп = У х"1 А--- А<” Л/(<Г1,...,<тп> = = У х°1 Л • Л Хпп □ /(<’Ч,...,СТ„) = 1
90 Глава 3. Булевы функции ТЕОРЕМА Всякая булева функция может быть выражена через дизъюнкцию, конъюнкцию и отрицание: У f е Рп 3 J[{V, Л, = func 3". Доказательство Если f = 0, то 0 — х Л х. Если f / 0, то см. предыдущую теорему. □ ТЕОРЕМА Всякая булева функция (кроме 1) может быть единственным образом выражена в виде совершенной конъюнктивной нормальной формы (СКНФ): f(X!,...,Xn) = Д V... Vz£". Доказательство По принципу двойственности из предыдущей теоремы. □ ОТСТУПЛЕНИЕ------------------------------------------------------------- Говорят, что некоторый класс формул ОС имеет нормальную форму, если существует другой класс формул ОС', которые называются нормальными формами, такой что любая формула класса ОС имеет единственную равносильную формулу из класса ОС'. Наличие у класса формул нормальной формы очень редкое, сильное и полезное свойство. Опо обеспечивает разрешимость, то есть наличие алгоритма проверки равносильности. Один и тот же класс ОС может иметь несколько различных нормальных форм, то есть несколько различных классов ОС'. 3.4.3. Построение СДНФ СДНФ булевой функции может быть построена по заданной таблице истинности с помощью следующего алгоритма. Алгоритм 3.2. Построение СДНФ Вход: вектор X : array [l..n] of string идентификаторов переменных, матрица V : array [1..2n, l..n] of 0..1 всех различных наборов значений переменных, вектор F : array [1..2n] of 0..1 соответствующих значений функции. Выход: последовательность символов, образующих запись формулы СДНФ для заданной функции. f: = false { признак присутствия левого операнда дизъюнкции } for i from 1 to 2n do if F[i] = 1 then if f then yield V { добавление в формулу знака дизъюнкции } else f: =true end if g: =false { признак присутствия левого операнда конъюнкции }
3.4. Нормальные формы 91 for j from 1 to n do if g then yield 'Л' { добавление в формулу знака конъюнкции } else д: =true end if if V[i, j] = 0 then yield { добавление в формулу знака отрицания } end if , , yield { добавление в формулу идентификатора переменной } end for end if end for ЗАМЕЧАНИЕ —--------------------------------------------------------------- Если зафиксировать порядок перечисления переменных в таблице истинности и порядок перечисления кортежей значений, то алгоритм построения СДНФ дает синтаксически однозначный результат. В этой книге переменные всегда перечисляются в лексикографи- ческом порядке, а кортежи булевских значений — в порядке возрастания целых чисел, задаваемых кортежами как двоичными шкалами (см. алгоритм 1.1). Такой порядок далее считается установленным. 3.4.4. Алгоритм вычисления значения булевой функции Некоторые классы формул допускают более эффективную интерпретацию по сравнению с алгоритмом Eval. Рассмотрим алгоритм вычисления значения бу- левой функции, заданной в виде СДНФ, для заданных значений переменных xi,...,xn. В этом алгоритме используется следующее представление данных. СДНФ задана массивом f array [l..fc,l..n] of 0..1, где строка /[г,*] содержит набор значений а1}...,<тп, для которого /(<7i,..., <тп) = 1, i е l..fc, к < п. ОТСТУПЛЕНИЕ --------------------------------------------------— Быстрое вычисление значения СДНФ имеет не только теоретическое, но и большое прак- тическое значение. Например, во многих современных программах с графическим интер- фейсом для составления сложных логических условий используется наглядный бланк в виде таблицы: в клетках записываются условия, причем клетки одного столбца считают- ся соединенными конъюнкцией, а столбцы — дизъюнкцией, то есть образуют ДНФ (или наоборот, в таком случае получается КНФ). В частности, так устроен графический ин- терфейс QBE (Query-by-Example), применяемый для формулировки логических условий при запросе к СУБД. Алгоритм 3.3. Алгоритм вычисления СДНФ Вход: массив, представляющий СДНФ: f : array [l..fc, l..n] of 0..1: множество значений переменных х : array [l..n] of 0..1. Выход: 0..1 — значение булевой функции. for г from 1 to A: do
92 Глава 3. Булевы функции for j from 1 to n do if /[м] / &еп ' next for г { x’j1 = 0 ==> ап171 A • • • /\xna" = 0 } end if end for return 1 { xj’1 &...&xn<Tn = 1 => V((Ji.CTm)xp 1} end for return 0 { все слагаемые в дизъюнкции = 0 } ЗАМЕЧАНИЕ ——----------------------------------------------------—------ В алгоритме использован оператор next, которому здесь придается следующая семанти- ка: выполнение текущего цикла прерывается, а выполнение программы продолжается со следующего шага цикла, указанного в операторе next. Такого рода операторы называются операторами структурного перехода. Операторы структурного перехода присутствуют в некоторых реальных языках программирования (например оператор continue в языке С), хотя обычно имеют более ограниченную семантику по сравНенйю с использованным здесь оператором next. Этот алгоритм в худшем случае выполняет к п сравнений, а в среднем — гораздо меньше, то есть он существенно эффективнее общего алгоритма интерпретации. 3.4.5. Эквивалентные преобразования Используя уже доказанные равносильности, можно преобразовывать по правилу замены одни формулы в другие, равносильные им. Преобразование формулы в равносильную называются эквивалентным преобразованием. Пример Используя равносильности из подраздела 3.2.2, покажем, что имеет место правило склеивания/расщепления: х Л у V х Л у = х. Действительно: (х А у) V {х А у) = х А (у V у) = х А 1 = х. ЗАМЕЧАНИЕ---------------------------------------------------------- Если равносильность из предыдущего примера применяется для уменьшения числа one раций, то говорят, что производится склеивание, а если наоборот, то расщепление. ТЕОРЕМА Для любых двух равносильных формул Э\ и Эз существует последова- тельность эквивалентных преобразований из Эх в $2 с помощью равносильностей, указанных в подразделе 3.2.2. Доказательство Любую формулу (кроме той, которая реализует 0) можно преобразовать в СДНФ с помощью равносильностей из подраздела 3.2.2 и правила расщепления из пре- дыдущего примера по следующему алгоритму.
3.4. Нормальные ормы 93 1. Элиминация операций. Любая булева функция реализуется формулой над ба- зисом {A, V, -1} (например, в виде СДНФ). Таким образом, любая присутству- ющая в формуле подформула с главной операцией, отличной от дизъюнкции, конъюнкции и отрицания, может быть заменена на подформулу, содержащую только три базисные операции. Например, элиминация импликации выполня- ется с помощью равносильности a?i —> %2 — ~'%i V х%. В результате этого шага в формуле остаются только базисные операции. 2. Протаскивание отрицаний. С помощью инволютивности отрицания и правил де Моргана операция отрицания «протаскивается», к переменным. В резуль- тате этого шага отрицания могут присутствовать в формуле только непосред- ственно перед переменными. 3. Раскрытие скобок. По дистибутивности конъюнкции относительно дизъюнк- ции раскрываются все скобки, являющиеся операндами конъюнкции. В ре- зультате этого шага формула приобретает вид дизъюнктивной формы-. \Aj), где Ak — это либо переменная, либо отрицание переменной. 4. Приведение подобных. С помощью идемпотентности конъюнкции удаляются повторные вхождения переменных в каждую конъюнкцию, а затем с помощью идемпотентности дизъюнкции удаляются повторные вхождения одинаковых конъюнкций в дизъюнкцию. В результате этого шага формула не содержит «лишних» переменных и «лишних» конъюнктивных слагаемых. 5. Расщепление переменных. По правилу расщепления в каждую конъюнкцию, которая содержит не все переменные, добавляются недостающие. В результате этого шага формула становится «совершенной», то есть в каждой конъюнкции содержатся все переменные. 6. Сортировка. С помощью коммутативности переменные в каждой конъюнк- ции, а затем конъюнкции в дизъюнкции сортируются в установленном поряд- ке (см. подраздел 3.4.3). В результате этого шага формула приобретает вид СДНФ. Заметим, что указанные преобразования обратимы. Таким образом, если даны две формулы, преобразуем их в СДНФ указанным алгоритмом. Если результаты не совпали, значит, формулы не равносильны, и эквивалентное преобразование одной в другую невозможно. Если же результаты совпали, то, применяя обрат- ные преобразования в обратном порядке, преобразуем полученную СДНФ во вторую формулу. Объединяя последовательность преобразований первой фор- мулы в СДНФ и обратных преобразований СДНФ во вторую формулу, имеем искомую последовательность преобразований. □
94 Глава 3. Булевы функции 3.5. Замкнутые классы В типичной современной цифровой вычислительно!! машине цифрами являются О и 1. Следовательно, команды, которые выполняет процессор, суть булевы функ- ции. Выше показано, что любая булева функция реализуется через конъюнкцию, дизъюнкцию и отрицание. Следовательно, можно построить нужный процессор, имея в распоряжении элементы, реализующие конъюнкцию, дизъюнкцию и от- рицание. Этот и следующий разделы посвящены ответу на вопрос: существуют ли (и если существуют, то какие) другие системы булевых функций, обладающих тем свойством, что с их помощью можно выразить все другие функции. 3. 5.1. Замыкание множества булевых функций Пусть F = {Л,... ,Лп}, fi € Рп- Замыканием F (обозначается [F]) называется множество всех булевых функций, реализуемых формулами над F: [F]: = {/Е Pn | / = func3]F]} . Свойства замыкания: 1. F с [F]; 2. [[F]] = И; 3. Fi С F2 => [Pi] С [F2]; 4. ([F] U [F2]) С [Fx U F2]. 3. 5.2. Некоторые замкнутые классы Класс (множество) функций F называется замкнутым, если [F] = F. Рассмотрим следующие классы функций: 1. Класс функций, сохраняющих 0: T0: = {f | /(0,...,0) = 0}. 2. Класс функций, сохраняющих 1: Тг = {/ I = 1}. 3. Класс самодвойственных функций: T*'. = {f\ f = f*}. 4. Класс монотонных функций: где а — (ах,... ,ап), [3 = (b1,.. .,bn),ai,bi е Е2, а С /3: = Vг а, С bi. 5. Класс линейных функций: Ть: - {/ | f = со + с^х -|-1- СпХп} , где + обозначает сложение по модулю 2, а знак конъюнкции опущен. ТЕОРЕМА Классы То, Ti,Tt,T^, Ть замкнуты.
3.5. Замкнутые классы 95 Доказательство Чтобы доказать, что некоторый класс F — замкнутый, достаточно показать, что если функция реализована в виде формулы над F, то она принадлежит F. До- казать, что произвольная формула обладает заданным свойством, можно с помо- щью индукции по структуре формулы (см. подраздел 3.3). База индукций очевид- на: функции из F реализованы как тривиальные формулы над F. Таким образом, осталось обосновать индукционные переходы для пяти рассматриваемых клас- сов. 1. Пусть /,/1,еТо И Ф = f(f1(x1,..-.,Xn),...,fn(x1,...,Xn)). Тогда Ф(0,..., 0) = /(Л(0,..., 0),..., /п(0,,.., 0)) = /(0,..., 0) = 0. Следовательно, Ф е Т0- 2. Пусть еТг и Ф = /(/i(a?i,... ,хп),..., /п(^1, • • • ,хп)). Тогда Ф(1,..., 1) = /(/1(1,..., 1),..., /п(1,..., 1) = /(1,..., 1) = 1. Следовательно, Ф е 1\. 3. Пусть /, /1,.. •, /п ё т, и Ф = /(/1(а?1, • • •, хп),fjx^хп)). Тогда Ф* =f*(fl(xl, • • • ,хп)т • •, f*(x!,...,xn)) = . .. ,хп),. .. ,fn(xi,... ,Хп)) = Ф. Следовательно, Ф € Т„. 4. Пусть /, Л,.;., fn е и Ф = /(/1(хг,..., хп),fnfa,..., жп)). Тогда а /3 =К/1(а), • • •, /п(а)) (Л(Д), • • •, /п(Д)) ==> =>/(Л(а), • • •, /п(а)) /(Л (/?), • • , /п(Д)) =* Ф(а) Ф(Х?)- Следовательно, Ф G 5. Пусть f, fa,..., /rt, 6 Ть и Ф = /(/i(a?i,хп),fn(xi-,хп)). Тогда f =CQ + Ci Я?! + • • • + СпХп, fl =Cq + с\х! + • • •,+ С„Хп, fn =Со + С^Хг + • • + с”хп. Подставим эти формулы в формулу для Ф. Имеем: Ф(<Г1,. =Со + сДсо + с}х! + • • • + с\хп) + ••• + с„(со + с\Х1 + • • • 4- с”) = —То 4“ d^xi Т • • • Т dfiX-n, Следовательно, Ф G Ть. О Пример Таблица принадлежности некоторых булевых функций рассмотренным замкну- тым классам:
96 Глава 3. Булевы функции То Т1 т. Tl 0 + — — + + 1 — + — + + X — — •+ • —. + ан А х2 + + — + — Таким образом, рассмотренные классы попарно различны, не пусты и не совпа- дают с Рп. 3.6. Полнота Класс функций F называется полным, если его замыкание совпадает с Рп:. И = рп. Другими словами, множество функций F образует полную систему, если любая функция реализуема в виде формулы над F. ТЕОРЕМА Пусть заданы две системы функций: F = {h,...,fm}uG = {91,...,gk}. Тогда, если система F полна и все функции из F реализуемы формулами над G, то система G также полна: ([F] = Pn&Vi fi = func 9i[G]) => [G] = Pn. Доказательство Пусть h — произвольная функция, h € Pn. Тогда [F] = Pn => h = func T[F] => 3*{Si//ft} — формула над G. Следовательно, 7i = funcS[G], □ Пример Система {V,A,->} — полная, как показано в подразделе 3.4.2. Следовательно, 1. система А} полная, так как Xi V х2 = А -чг); 2. система V} полная, так как xi А х2 = —•(—»a?i V -<х2); 3. система {|} полная, так как -<х = х | х, XiAx2 = ->(#i | х2) = (яц | л2) | (#i | х2); 4. система {0,1, А, +} полная, так как -<х = х +1 (здесь + означает сложение по модулю 2). Представление булевой функции над базисом {0,1, А, +} называет- ся полиномом Жегалкина. Таким образом, всякая булева функция представима в виде • • . . • XiB, (»1, где S — сложение по модулю 2, знак • обозначает конъюнкцию и 6 Е2.
3.6. Полнота 97 ТЕОРЕМА (Пост) Система булевых функций F полна тогда и только тогда, ко- гда она содержит хотя бы одну функцию, не сохраняющую нуль, хотя бы одну функцию, не сохраняющую единицу, хотя бы одну несамодвойственную функцию, хотя бы одну немонотонную функцию и хотя бы одну нелинейную функцию: [F] = Рп <=> ->(F cTqVFcTiVFcT, VFcT-gVFC Т£). Доказательство Необходимость. От противного. Пусть [F] '= Рп и F С То V F С Ti V F С Т» V F СТ^ V F CTL. Введем обозначение: г — один из индексов 0, 1, *, или L. Тогда Tt = [Т<] => [F] с Ti .=* Рп С Ti ==> Рп = Ti, но Рп Т по таблице из подраздела 3.5.2. Достаточность. Пусть ->(F С То V F С Tj V F С Т, V F С Т^ V F С Ть). Тогда 3 F = {/о, Л, А, /<, /ь } /о То & /1 Ti & А Т, & Д Т^ & Л Ть. Функции /о,А,А,Д,/ь не обязательно.различны и не обязательно исчерпы- вают F. Покажем, что отрицание и конъюнкция реализуются в виде формул над F'. Тем самым теорема будет доказана. Построение проводится в три этапа: на первом строятся формулы, реализующие константы 0 и 1, которые нужны на третьем этапе. На втором этапе строится формула, реализующая отрицание. На третьем этапе строится формула, реализующая конъюнкцию. 1. Построим формулу, реализующую 1. Пусть <р(х) : = fo(x,... ,х). Тогда <р(0) = /о(0,..., 0) / 0 => <р(0) = 1. Возможны два случая: </?(1) = 1 и ^>(1) — 1. 1) <р(1) = 1. В этом случае формула <р реализует 1. 2) у>(1) = 0. В этом случае формула р реализует отрицание. Тогда рассмотрим функцию А- Имеем: А £ A f»(ai,...,an) /ft(a1,...,an). Следовательно, /.(aj,..., an) — ,a,n). Пусть теперь ф{х): = А (#О1,..., хап). Тогда ^(о) =А(0“1,... ,о“») = A(«i> • • • = =A(aj, • • •, ап) = А(1“‘,..., 1“») = ^(1) Таким образом, ф(0) = ^(1), откуда ф .= 1 V ф — 0. Если ф = 1, то требу- емая константа 1 построена. В противном случае ^ реализует 0, и значит ^>(^(я:)) = ф(х) реализует 1. Построение 0 аналогично, только вместо /0 нужно использовать /1.
98 Глава 3. Булевы функции 2. Построим формулу, реализующую отрицание. Рассмотрим функцию Имеем: As № =^За=(а1,...,ап),/3 = (Ь1,...,Ьп) а^/3&Д(а) > f<(/3) Тогда а С 0 => Vi at = bi V а, = 0 & bi ~ 1, Но /^(а) f^.(0) => ос 0 ==> 3 J с l..n j 6 J ==> aj — 0&:bj = 1. Другими словами, J — это множество индексов j, для которых а3 ^Ь3. Пусть ср(х) : — сп), где Cj : = х, если j e J, n с3: = a,j(= bj), если j J. Тогда ^(°) = /«(ei,...,Cn){0//a:} = Д(а) > Д(Д) = /«(cj,... ,cn){l//a:} = Имеем: </?(0) > y>(l) ==> ф(0) = 1 & ^>(1) = 0 => cp(x) = x. 3. Построим формулу, реализующую конъюнкцию. Рассмотрим функцию /д. Имеем: Д е Рп =*• fi - aao,.. ,xis. Но fL Tl, следова- тельно, в полиноме Жегалкина существует нелинейное слагаемое, содержащее конъюнкцию по крайней мере двух переменных. Пусть, для определенности, это xi и х2. Тогда fL = хг • х2 • fa(x3,..., хп) + • fb(x3, ...,хп) + + Х2 fc(x3,. . . , Хп) + fdfa, Хп), причем /а(а?3,...,хп) / 0. Следовательно, Заз,...,an /а(аз, • • •,ап) — 1. Пусть b: ” /ь(аз,..., ап), с: — Ус(^з, • • •, пп), ” А(^з? • • •, оп) и 9?(sri,x2) = = /£(^1,^2, а3,... ,ап) — Xi • х2 + b • хх + с • х2 + d. Пусть далее il>(xi,x2): — ip{x3 + с,х2 + b) + b с + d- Тогда ^2) — (Xi + с) (х2 + b) + b (xi + с) + с (х2 + b) + d + b • с + d = = x1-x2+c-x2 + b-xx+b-c + b-xi + b- c + c-x2 + b- c + uc + + d + b • c + d = xi x2. (Функции x + а выразимы, так как x + 1 = x, x + 0 = x, а константы 0, 1 и отрицание уже построены.) □ Комментарии Прекрасным руководством по булевым функциям являются книги [25] и [17], в которых можно найти обширный дополнительный материал, в частности, опу- щенные за недостатком места различные алгоритмы построения, упрощения и минимизации нормальных форм. Упражнения 3.1. Доказать, что число булевых функций от п переменных, среди которых к фиктивных, равно 22”- .
Упражнения 99 3.2. Проверить равносильности подраздела 3.2.2 путем построения таблиц ис- тинности. 3.3. Какие функции являются двойственными для +, =, |, 4-? 3.4. Построить СДНФ ДЛЯ Х1 | Х2, Х\ 4- ^2> ^1 -> ^2, ^1 + ^2- 3.5. Проверить принадлежйость классам То, Ti, Т,, Т^, Тд функций 4-, |, V, —>, ф. 3.6. Доказать, что f £ То ==> f £ Т„ V (/ Т & f 7^).
ГЛАВА 4 Логические исчисления С древнейших времен человечеству известна логика, или искусство правиль- но рассуждать. Вообще, способность к рассуждениям — это именно искусству. Имея какие-то утверждения (посылки), истинность которых проверена, скажем, на опыте, логик путем умозрительных построений приходит к другому утвержде- нию (заключению), которое также оказывается истинным (в некоторых случа- ях). Опыт древних (чисто наблюдательный) был систематизирован Аристотелем. Он рассмотрел конкретные виды рассуждений, которые назвал силлогизмами. А именно, Аристотель рассмотрел так называемые категорические утверждения четырех видов: ► все А обладают свойством В (все А суть В); ► некоторые А обладают свойством В (некоторые А суть В); ► все А не обладают свойством В (все А суть не В); ' ► некоторые А не обладают свойством В (некоторые А суть не В) и зафиксировал все случаи, когда из посылок такого вида выводятся заключения одного из этих же видов. Пример 1. Все люди смертны. Сократ — человек. Следовательно, Сократ смертен. Это рассуждение правильно, потому что подходит под один из образцов силлогиз- мов Аристотеля. 2. Все дикари раскрашивают свои лица. Некоторые современные женщины рас- крашивают свои лица. Следовательно, некоторые современные женщины — дикари. Это рассуждение неправильно, хотя, видимо, все входящие в него утверждения истинны. Логика Аристотеля — это классическая логика, то есть наука, традиционно отно- сящаяся к гуманитарному циклу и, тем самым, находящаяся вне рамою данной книги.
4.1. Логические связки 101 Предметом этой главы являются некоторые элементы логики математической, которая соотносится с логикой классической примерно так, как язык Паскаль соотносится с английским языком. Эта аналогия довольно точна и по степени формализованности, и по широте применимости в реальной жизни, и по значи- мости для практического программирования. План главы состоит в том, чтобы на основе небольшого предварительного рассмотрения ввести понятие «формаль- ной теории» или «исчисления» в его наиболее общем виде, а затем конкретизи- ровать это понятие примерами двух наиболее часто используемых исчислений: исчисления высказываний и исчисления предикатов. 4.1. Логические связки Цель данного раздела — ввести специфическую «логическую» терминологию и указать на ее связь с материалом предшествующих глав. 4.1.1. Высказывания Элементами логических рассуждений являются утверждения, которые либо ис- тинны, либо ложны, но не то и другое вместе. Такие утверждения называются (простыми) высказываниями. Простые высказывания обозначаются пропозицио- нальными переменными, принимающими истинностные значения «И» и «Л». Из простых высказываний с помощью логических связок могут быть построены со- ставные высказывания. Обычно рассматривают следующие логические связки: Название Прочтение Обозначение Отрицание не Конъюнкция и Дизъюнкция или Импликация если ... то 4.1.2. Формулы Правильно построенные составные высказывания называются (пропозиционалъ ными) формулами. Формулы имеют следующий синтаксис: (формула):: = И | Л | (пропозициональная переменная) | (-.(формула)) | ((формула) & (формула)) | ((формула) V (формула)) | ((формула) —> (формула)) Для упрощения записи вводится старшинство связок (—, &, V, —>) и лишние скобки опускаются.
102 Глава 4. Логические исчисления Истинностное значение формулы определяется через истинностные значения ее составляющих в соответствии со следующей таблицей: А в -А А&В AVB А->В Л л И Л Л И Л и И Л И И И л Л Л И Л И и Л И И И 4.1.3. Интерпретация Пусть А(т1,..., хп) — пропозициональная формула, где х^,..., хп — входящие в нее пропозициональные переменные. Конкретный набор истинностных значе- ний, приписанных переменным х\,..., хп, называется интерпретацией форму- лы А. Формула может быть истинной (иметь значение И) при одной интер- претации и ложной (иметь значение Л) при другой интерпретации. Значение формулы А в интерпретации I будех< обозначать 1(A). Формула, истинная при некоторой интерпретации, называется выполнимой. Формула, истинная при всех возможных интерпретациях, называется общезначимой (или тавтологией). Фор- мула, ложная при всех возможных интерпретациях, называется невыполнимой (или противоречием). Пример А V ->А — тавтология, А & -,А — противоречие, А -> ->А — выполнимая формула, она истинна при I(А) = Л. ТЕОРЕМА Пусть А — некоторая формула. Тогда: 1. если А — тавтология, то ->А — противоречие, и наоборот; 2. если А — противоречие, то -М — тавтология, и наоборот; 3. если А — тавтология, то неверно, что А — противоречие, но не наоборот; 4. если А — противоречие, то неверно, что А — тавтология, но не наоборот. Доказательство Очевидно из определений. □ ТЕОРЕМА Если формулы А и А -> В — тавтологии, то формула В — тавтоло- гия. Доказательство От противного. Пусть 1(B) = Л. Но /(А) = И, так как А — тавтология. Зна- чит, 1(А -> В) = Л, что противоречит предположению о том, что А -> В — тавтология. □
4.1. Логические связки 103 4.1.4. Логическое следование и логическая эквивалентность Говорят, что формула В логически следует из формулы А (обозначается А=>В), если формула В имеет значение И при всех интерпретациях, при которых фор- мула А имеет значение И. Говорят, что формулы А и В логически эквивалентны (обозначается А <=ф- В или просто А = В), если они являются логическим следствием друг друга. Логически эквивалентные формулы имеют одинаковые значения при любой интерпретации. ТЕОРЕМА (Р -> Q) <=> (-Р V Q). Доказательство Для доказательства достаточно проверить, что формулы действительно имеют одинаковые истинностные значения при всех интерпретациях. р Q P->Q -р -PVQ и и И л И л и и и И и л л л Л л л и и и □ ТЕОРЕМА Если А, В, С — любые формулы, то имеют место следующие логиче- ские эквивалентности: 1. AV А = А, 2. А V В = В V А, 3. А V (В V С) = (А V В) V С, 4. AV(B&C) = (AvB)&(AvC), 5. (AkB)V А = А, 6. А V Л = А, 7. А V И = И, 8. -п(-пЛ) = А; 9. -.(A&B) = -.AV-,B, 10. А V -.А = И, А&А = А; А&В = В&А; А&(В&С) = (А&В)&С; А&(В V С) = (А & В) V (А & С); (AV В)&А = А; А&Л = Л; А&И = А; -i(AVB) = -.А&-пВ; А&-А = Л. Доказательство Непосредственно проверяется построением таблиц истинности. □ ЗАМЕЧАНИЕ------------------------------------------------------— Таким образом, алгебра ({И,Л}; является булевой алгеброй, которая называется алгеброй высказываний.
104 Глава 4. Логические исчисления ТЕОРЕМА Pi &... & Рп ==> Q тогда и только тогда, когда (Pi &... & Рп) -> Q — тавтология. Доказательство Необходимость. Пусть I(Pi &... &РП) = И. Тогда I(Q) = И и ДР1&.. .&Рп -> Q) = И. Пусть I(Pi&... &РП) = Л. Тогда I(Pi&... &РП ->(?) = И при любой интерпре- тации I. Таким образом, формула Рх&... &РП -> Q общезначима. Достаточность. Пусть /(Pi&... &РП) = И. Тогда I(Q) = И, иначе бы формула Р1&.. .&Pn -> Q не была бы тавтологией. Таким образом формула Q — логическое следствие фор- мулы Pi&...&Pn. □ ТЕОРЕМА Pi &... & Рп => Q тогда и только тогда, когда Pi&c.. ,&Рп& ->Q — противоречие. Доказательство По предыдущей теореме Pi &... & Рп =► Q тогда и только тогда, когда формула Pi&...&Pn -> Q — тавтология. По первой теореме подраздела 4.1.3 форму- ла Pi &... & Рп —> Q является тавтологией тогда и только тогда, когда формула -(Pi &... & Рп -> Q) является противоречием. Имеем: -(А&.. ,&Pn -> Q) = -НР1&..,ЬРп) VQ) = = — (Pi&...&Pn)&-,Q) = Pi&...&Pn&-,Q. □ 4.1.5. Подстановки Пусть А — некоторая формула, в которую входит переменная х (обозначается Л(... х...)) или некоторая подформула В (обозначается Л(... В...)), и пусть С — некоторая формула. Тогда А(.. .х.. .){С//х} обозначает формулу, полученную из формулы А подстановкой формулы С вме- сто всех вхождений переменной х, а А(.. .В • ){С/В) обозначает формулу, полу- ченную из формулы А подстановкой формулы С вместо некоторых (в частности, вместо одного) вхождений подформулы В. ТЕОРЕМА Если А(... х...) — тавтология и В — любая формула, то Л(... х... ){В//х} — тавтология.
4.2. Формальные теории 105 Доказательство Пусть С: = А(...х... ){В//х}. Пусть I — интерпретация С (она не содержит х). Пусть I': — IU {х: = 1(С)}. Тогда I'(A) = 1(C), но 1'(А) = И, следовательно 1(C) - И. □ ТЕОРЕМА Если А(.. .В...) и В = С, a D: = A(...B ...){С/В}, то 4 = D. Доказательство Пусть I — любая интерпретация. Тогда 1(B) = 1(C), значит 1(A) = 1(D). □ 4.2. Формальные теории Исторически понятие формальной теории было разработано в период интенсив- ных исследований в области оснований математики для формализации собствен- но логики и теории доказательства. Сейчас этот аппарат широко используется при создании специальных исчислений для решения конкретных прикладных задач. Рамки книги не позволяют привести развернутых примеров таких специ- альных исчислений (они довольно объемны), но, тем не менее, такие примеры существуют. 4.2.1. Определение формальной теории Формальная теория Т — это: 1. множество А символов, образующих алфавит; 2. множество S' слов в алфавите Л, IF С Л*, которые называются формулами', 3. подмножество Ъ формул, Ъ С S', которые называются аксиомами; 4. множество 3? отношений R на множестве формул, R е 3?, R с STl+1, которые называются правилами вывода. Множество символов Л может быть конечным или бесконечным. Обычно для образования символов используют конечное множество букв, к которым, если нужно, приписываются в качестве индексов натуральные числа. Множество формул S’ обычно задается индуктивным определением, например, с помощью формальной грамматики. Как правило, зто множество бесконечно. Множества Л и S’ в совокупности определяют язык, или сигнатуру, формальной теории. Множество аксиом "В может быть конечным или бесконечным. Если множество аксиом бесконечно, то, как правило, оно задается с помошью конечного множе- ства схем аксиом и правил порождения конкретных аксиом из схемы аксиом. Обычно аксиомы делятся на два вида: логические аксиомы (общие для целого класса формальных теорий) и нелогические (или собственные) аксиомы (опреде- ляющие специфику и содержание конкретной теории). Множество правил вывода 3?, как правило, конечно.
106 Глава 4. Логические исчисления 4.2.2. Выводимость Пусть Fi,..., Fn, G — формулы теории 7, то есть Fi,..., Fn,G е 7. Если суще- ствует такое правило вывода R, R е 5?, что (Fi,..., Fn,G) е R, то говорят, что формула G непосредственно выводима из формул Fi,...,Fn по правилу выво- да R. Обычно этот факт записывают следующим образом: fi I > р G й’ где формулы Fi,..., Fn называются посылками, а формула G — заключением. ЗАМЕЧАНИЕ-------------------------------------------------------- Обозначение правила вывода справа от черты, разделяющей посылки и заключение, часто опускают, если оно ясно из контекста. Выводом формулы G из формул Fi,...,Fn в формальной теории 7 называет- ся такая последовательность формул Ei,...,Ek, что Ek = G, а любая форму- ла Ei (i < к) является либо аксиомой (Ej € 3), либо исходной формулой Fj (Ei = Fj), либо непосредственно выводима из ранее полученных формул Е31,..., Е3п (ji,..., jn < г). Если в теории 7 существует вывод формулы G из формул Fi,..., Fn, то зто записывают следующим образом: Fi,...,FnhT G, где формулы Fi,..., F„ называются гипотезами вывода. Если теория 7 подразу- мевается, то ее обозначение обычно опускают. Если I-у G, то формула G называется теоремой теории 7 (то есть теорема — это формула, выводимая только из аксиом, без гипотез). Если Г f-y G, то Г, Д I-у G, где Г и Д - любые множества формул (то есть при добавлении лишних гипотез выводимость сохраняется). ЗАМЕЧАНИЕ-------------------------------------------------------------- При изучении формальных теорий нужно различать теоремы формальной теории и теоре- мы о формальной теории, или метатеоремы. Это различие не всегда явно формализуется, но всегда является существен!ням. В этой главе теоремы конкретной формальной теории, как правило, записываются в виде формул, составленных из специальных знаков, а мета- теоремы формулируются на естественном языке, чтобы их легче было отличать от теорем самой формальной теории. 4.2.3. Интерпретация Интерпретацией формальной теории 7 в область интерпретации М называется функция I: 7 -> М, которая каждой формуле формальной теории 7 однознач- но сопоставляет некоторое содержательное высказывание относительно объектов множества (алгебраической системы) М. Это высказывание может быть истин- ным или ложным (или не иметь истинностного значения). Если соответствую- щее высказывание является истинным, то говорят, что формула выполняется в данной интерпретации.
4 2. Формальные теории 107 ОТСТУПЛЕНИЕ-------------------------------------------------—---- В конечном счете нас интересуют такие формальные теории, которые описывают какие-то реальные объекты и связи между ними. Речь идет прежде всего о математических объектах и математических теориях, которые выбираются в качестве области интерпретации. Интерпретация I называется моделью множества формул Г, если все формулы этого множества выполняются в интерпретации I. Интерпретация I называется моделью формальной теории Т, если все теоремы этой теории выполняются в интерпретации I (то есть все выводимые формулы оказываются истинными в данной интерпретации). 4.2.4. Общезначимость и непротиворечивость Формула называется общезначимой (или тавтологией), если она истинна в лю- бой интерпретации. Формула называется противоречивой, если она ложна в лю- бой интерпретации. Формула G называется логическим следствием множества формул Г, если G вы- полняется в любой модели Г. Формальная теория Т называется семантически непротиворечивой, если ни одна ее теорема не является противоречием. Таким образом, формальная теория при- годна для описания тех множеств (алгебраических систем), которые являются ее моделями. Модель для формальной теории У существует тогда и только тогда, когда У семантически непротиворечива. Формальная теория У называется формально непротиворечивой, если в ней ие являются выводимыми одновременно формулы F и ->F. Теория У формально непротиворечива тогда и только тогда, когда она семантически непротиворечива. ОТСТУП Л ЕН И Е------------------------------------------------------- Последние утверждения являются доказуемыми метатеоремами, доказательства которых опускаются из-за технических сложностей. 4.2.5. Полнота, независимость и разрешимость Пусть множество М является моделью формальной теории Т. Формальная тео- рия У называется полной (или адекватной), если каждому истинному высказы- ванию М соответствует теорема теории У. Если для множества (алгебраической системы) М существует формальная пол- ная непротиворечивая теория У, то М называется аксиоматизируемым (или фор- мализуемым). Система аксиом (или аксиоматизация) формально непротиворечивой теории У называется независимой, если никакая из аксиом не выводима из остальных по правилам вывода теории 'Т.
108 Глава 4. Логические исчисления Формальная теория У называется разрешимой, если существует алгоритм, кото- рый для любой формулы теории определяет, является ли эта формула теоремой теории. Формальная теория У называется полуразрешимой, если существует алго- ритм, который для любой формулы F теории выдает ответ «ДА», если F является теоремой теории и, может быть, не выдает никакого ответа, если F не является теоремой (то есть алгоритм применим не ко всем формулам). 4.3. Исчисление высказываний В этом разделе дано описание формальной теории исчисления высказываний. Поскольку исчисление высказываний уже знакомо читателю по материалам раз- делов 3.1 и 4.1, здесь сделан сильный акцент именно на формальной технике. Зна- комство с чисто механическим характером формальных выводов подготавливает рассмотрение методов автоматического доказательства теорем в разделе 4.5. 4.3.1. Классическое определение исчисления высказываний Исчисление высказываний — это формальная теория £, в которой: 1. Алфавит: -> и -> — связки-, ( , ) — служебные символы; а, Ь,..., ai, bi,... — пропозициональные переменные. 2. Формулы: 1) переменные суть формулы; 2) если А, В — формулы, то (->А) и (А -> В) — формулы. 3. Аксиомы: А\ : (А -> (В -> А)); А2 : ((А -4 (В -> С)) -> ((А -> В) -> (А -> С))); А3 : ((-iB->->А)-> ((-1В-> А)-> В)). А А —> В 4. Правило: ———-----Modus nonens Здесь А и В — любые формулы. Таким образом, множество аксиом теории £ бесконечно, хотя задано тремя схемами аксиом. Множество правил вывода также бесконечно, хотя оно задано только одной схемой. ЗАМЕЧАНИЕ ---------------------------- Латинское словосочетание Modus ponens обычно переводят на русский как правило отде- ления. При записи формул лишние скобки опускаются, если это не вызывает недоразу- мений. Другие связки вводятся определениями (а не аксиомами): А&В: = -.(А->-.В), А VВ: = ->А —> В. Любая формула, содержащая эти связки, рассматривается как синтаксическое сокращение собственной формулы теории £.
4.3. Исчисление высказываний 109 ОТСТУПЛЕНИЕ------------------------------------------------------ Классическое задание теории £ с помощью схем аксиом над любыми формулами вполне соответствует математической традиции (мы пишем (а + b)2 = а2 +2ab+b2, подразумевая под а и Ь не только любые числа, но и любые выражения!). В то же время это не очень удобно для представления в ЭВМ. В следующих трех разделах вводится определение исчисления высказываний, более удобное для реализации на ЭВМ. 4.3.2. Частный случай формулы Если в формулу (исчисления высказываний) А вместо переменных ... ,;гп подставить соответственно формулы Bi,..., Вп, то получится формула В, кото- рая называется частным случаем формулы А: B: = A(...,xi,...){Bi//xi%=1. Каждая формула Bi подставляется вместо всех вхождений переменной xt. Набор подстановок {Вг//х{}™=1 называется унификатором. Формула С называется совместным частным случаем формул А и В, если С является частным случаем формулы А и одновременно частным случаем форму- лы В при одном и том же наборе подстановок, то есть С = А(..., Xi,...) {Х,//х{}?=1 кС = В(...,х{,...) {XJ/x^ • Формулы, которые имеют совместный частный случай, называются унифицируе- мыми, а набор подстановок {Хг//а;г}"=1, с помощью которого получается совмест- ный частный случай унифицируемых формул, называется общим унификатором. Наименьший возможный унификатор называется наиболее общим унификато- ром. Набор формул Bi,..., Вп называется частным случаем набора формул Ai,..., Ап, если каждая формула Bi является частным случаем формулы Ai при одном и том же наборе подстановок. Набор формул Ci,...,Cn называется совместным частным случаем наборов формул Ai,..., Ап и Bi,..., Вп, если каждая форму- ла Ci является частным случаем формул Ах и Bi при одном и том же наборе подстановок. 4.3.3. Алгоритм унификации Если язык формул удовлетворяет определенным условиям, то можно прове- рить, являются ли две заданные формулы унифицируемыми, и если это так, то найти наиболее общий унификатор. В частности, это возможно для типично- го языка формул, описанного в подразделе 4.3.1. В следующем алгоритме пред- полагается, что функция / осуществляет синтаксический разбор формулы и возвращает знак главной операции (то есть -> или признак того, что формула является переменной), а функции I и г возвращают левый и правый операнды главной операции, то есть подформулы (полагаем, что отрицание имеет только правый операнд). Набор подстановок (унификатор) представлен в виде гло- бального массива S, значениями индекса которого являются имена переменных,
110 Глава 4. Логические исчисления а значениями элементов — формулы, которые подставляются вместо соответ- ствующих переменных. Алгоритм 4.1. Алгоритм унификации — рекурсивная функция Unify Вход: формулы А и В. Выход: false, если формулы не унифицируемы; true и наиболее общий унификатор S в противном случае. if /(А) — переменная then v: = У (А) { переменная } if S'[и] — 0 then S[t>]: = В; return true { то есть добавляем подстановку {В//v} } else return (S[v] / В) { либо эта подстановка уже есть, либо унификация невозможна } end if end if if f(A) / f(B) then return false { главные операции различны — унификация невозможна end if if /(A) =' then returrt Unify(r(A),r(B)) { пытаемся унифицировать операнды отрицаний } end if if 7(A)='-»' then return Unify(l(A), 1(B)) Unify(r(A), r(B)) { пытаемся унифицировать операнды им- пликаций } end if Обоснование При любых подстановках формул вместо переменных главная операция (связка) формулы остается неизменной. Поэтому, если главные операции формул раз- личны, то формулы заведомо не унифицируемы. В противном случае, то есть еслй главные операции совпадают, формулы унифицируемы тогда и только то- гда, когда унифицируемы подформулы, являющиеся операндами главной опера- ции- Эта рекурсия заканчивается, когда сопоставление доходит до переменных. Переменная унифицируется с любой формулой (в частности, с другой перемен- ной) простой подстановкой этой формулы вместо переменной. Но подстановки для всех вхождений одной переменной должны совпадать. □ 4.3.4. Конструктивное определение исчисления высказываний Алфавит и множество формул — те же (см. подраздел 4.3.1). Аксиомы — три конкретные формулы: Ai: (а (Ь —> а)); Ai: ((а -+ (Ь -> с)) -> ((а -> Ь) -+ (а -> с))); Ai: ((->Ь-*->а)-> ((-.&-> а)-> Ь)).
4.3. Исчисление высказываний 111 Правила вывода: 1. Правило подстановки: если формула В является частным случаем формулы А, то В непосредственно выводима из А. 2. Правило Modus ponens: если набор формул А, В, С является частным случаем набора формул а, а -> Ь, Ь, то формула С является непосредственно выводимой из формул А и В. ЗАМЕЧАНИЕ----------------------------------------------------------- Здесь а, а —> b, b — это три конкретные формулы, построенные с помощью переменных а, Ь и связки — 4.3.5. Производные правила вывода Исчисление высказываний £ — это достаточно богатая формальная теория, в которой выводимы многие важные теоремы. ЗАМЕЧАНИЕ----------------------------------------------------- Выводимость формул в теории £ доказывается путем предъявления конкретного вывода, то есть последовательности формул, удовлетворяющих определению, данному в разде- ле 4.2.2. Для удобства чтения формулы последовательности вывода выписываются друг под другом в столбик, слева указываются их номера в последовательности, а справа ука- зывается, на каком основании формула включена в вывод (то есть она является гипотезой или получена из схемы аксиом указанной подстановкой, или получена из предшествую- щих формул по указанному правилу вывода и т. д.). ТЕОРЕМА А А Доказательство 1. (А -> ((А —> А) —> Л)) Л15 {А -> А/В} 2. ((Л -> ((Л -> А)-> Л)) -+ ((А -» (А -> А)) (А -> А))) А2; {А -> А/В; А/С} 3. ((А -> (А -+ А)) -> (А -> А)) МР; 1,2 4. Л-^(А^А) Аг, А/В 5. А -> А МР; 4,3 □ ТЕОРЕМА А Нс В -> А Доказательство 1. А гипотеза 2. А —> (В —> A) Ai 3. В А МР; 1,2
1 2 Глава 4. Логические исчисления Всякую доказанную выводимость можно использовать как новое (производное) правило вывода. Например, последняя доказанная выводимость называется пра- вилом введения импликации: 4.3.6. Дедукция В теории £ импликация очень тесно связана с выводимостью. ТЕОРЕМА (дедукции) Если Г, А Нс В, то Г l-д А -> В и обратно. Доказательство Туда. Пусть Ei,...,En — вывод В из Г,А. Еп = В. Индукцией по i (1 п) покажем, что Г 1-д А -> Ei. Тем самым теорема будет доказана. База: i — 1. Возможны три случая. 1. Пусть Ei — аксиома. Тогда рассмотрим вывод Е\, Ei —» (А —>ЕХ), А -> Ei. Имеем (-д А -> Ei. 2. Пусть Ei € Г. Тогда рассмотрим вывод Eit Ei -> (А Ei), А -> Ех. Имеем Г (-д А —> Ei. 3. Пусть Ei = А. Тогда по первой теореме предыдущего раздела Рд Ег —> Eit а значит Ид А -> Ех. В любом случае Г 1-д А -> Ег. Таким образом, база индукции доказана. Пусть теперь Г 1-д А -> Ei для всех i < к. Рассмотрим Ek- Возможны четыре случая: либо Ek — аксиома, либо Ek € Г, либо Ek = А, либо формула Ek получена по правилу Modus ponens из формул Et и Ej, причем г, j < к и Ej = Ei -> Ek- Для первых трех случаев имеем Г (-д A -t- Ek аналогичным образом. Для четвертого случая по индукционному предположению имеется вывод Г 1-д А -> Ei и вывод Г Ид А -> (Ei —» Ek). Объединим эти выводы и достроим следующий вывод: п. (А (Ei Ek)) ((А Ei) (АЕк)) A2-,{Ei/B,EkfC} А —> Ек п + 1. (А -> Ei) -> (А -> Ек) п + 2. А —> Ek MP; j, п . МР; г, п + 1 Таким образом, Г (-д А -> Ек' для любого к, в частности, для к = п. Но Еп = В, то есть Г Нд А -> В. Обратно. Имеем вывод Г Рд А -> В, состоящий из п формул. Достроим его следующим образом. п. А-> В п +1. А гипотеза п + 2. В MP; п + 1, п
4.3. Исчисление высказываний 113 Таким образом, имеем Г, А Не В. ЗАМЕЧАНИЕ------------------------------------------------------------- Схема аксиом Аз теории £, не использовалась в доказательстве, поэтому теорема дедукции имеет место для более широкого класса теорий, чем £. СЛЕДСТВИЕ 1 Если А Нс В, то I-£ А-> В и обратно. Доказательство Г: = 0 □ СЛЕДСТВИЕ 2 А -> В, В -> С Нс А С. Доказательство 1. А->В 2. В 3. А 4. В 5. С 6. А->В,В->С,АНс С 7. А->В,В->С1-£ А->С гипотеза гипотеза гипотеза МР; 3, 1 МР; 4, 2 1-5 по теореме,дедукции. ЗАМЕЧАНИЕ------------—------------------------- Это производное правило назывется правилом транзитивности. СЛЕДСТВИЕ 3 А-> (В-> С),В 1-£ А-> С. Доказательство 1. А -> (В -> С) 2. А 3. В^С 4. В 5. С 6. А->(В^С),В,А1-£, С 7. А^(В-*С),В\~сА^С гипотеза гипотеза МР; 2, 1 гипотеза МР; 4, 3 1-5 по теореме дедукции. ЗАМЕЧАНИЕ------------------------------ Это производное правило назывется правилом сечения.
1 14 Глава 4. Логические исчисления 4.3.7. Некоторые теоремы теории Z Множество теорем теории £ бесконечно. Здесь приведены некоторые теоремы, которые используются в дальнейших построениях. ЗАМЕЧАНИЕ--------------—--------------------------------------- Каждая доказанная теорема (то есть формула теории, для которой построен вывод) может использоваться в дальнейших выводах на правах аксиомы. ТЕОРЕМА В теории £ выводимы следующие теоремы: а) Нс ->->А —> А б) Нс А —> —А в) Нс -А -+ (А В) г) Нс (-В -А) -> (А -> В) д) he (А -> В) -> (-В -> -А) е) Нс А -+ ЬВ -> -(А -+ В)) ж) Нс (А —> В) —> ((->А -> В) -> В) Доказательство Доказательство теоремы а: Нс —А -> А. № Утверждение 1. (-,а^—А)^(ЬА^А)^А) 2. -А -А 3. (-А -> —А) -> А 4. -,-пА-> (-АА) 5. —А 4 А Обоснование А3;{А/В,-А/А} первая теорема 4.3.5; {—>А/А} Сл. 3; {-А -> ^А/А, -А -> -А/В, А/С} Ai;{—А/А,-А/В} Сл. 2; {—А/А,-АА/В, А/С} Доказательство теоремы б: Нс А —» ->->А. № Утверждение 1. (—А -> ->А) -> ->((-—А->А)->—А) 2. —А -> -А 3. (™А -+ А) -> -п-пА 4. А (—А -> А) 5. А -> -'-А Обоснование Аз; {—А/В} а; {-А/А} МР; 2, 1 А1;{—А/В} Сл. 2;-{—А/В,А/А,— А/С}
4.3. Исчисление высказываний 115 Доказательство теоремы в: Нс -А. -4 (А -4 В). № Утверждение Обоснование 1. -нА гипотеза 2. А гипотеза 3. А -4 (-В А) А1;{->В/В} 4. -А -4 (-В -+ -А) Ai;{-A/A,-B/B} 5. -В -4 А МР; 2, 3 6. -.В -4 -нА МР; 1, 4 7. (-В -4 -А) -4 ((-В -4 А) -4 В) Аз 8. (-В -4 А) -4 В МР; 6, 7 9. В МР; 5, 8 10. -нА, A he В 1-9 И. -А Их А -4 В теорема дедукции 12. Ис -А -+ (А В) теорема дедукции Доказательство теоремы г: Нс "‘В -А) (А -ь В). № Утверждение Обоснование 1. -В->-А гипотеза 2. А гипотеза 3. (-.В -4 -А) -4 ((-В 4 А) 4В) Аз 4. А -4 (-В -4 А) А1;{-.В/В} 5. (-.В -4 А) -4 В МР; 1, 3 6. А^В Сл. |2; {-^В-^А/В,В/С 7. В МР; 2, 6 8. -В->-А, А Нс В 1-7 9. -^В -A he А В теорема дедукции 10. Нс ЬВ -.А) -> (А -> В) теорема дедукции Доказательство теоремы d:\~z (А -> В) -4 (->В -4 ->А). № 1. Утверждение А->В Обоснование гипотеза 2. —А-> А а 3. —А-> В Сл. 2; {А/В,^А/А,А/С} 4. В^-^В б', {В/А} 5. -,-,Л -> -.-нВ Сл. 2; {-н-нА/А,— В/С} 6. (-.-.А -> —В) -ч. (-.В -4. -.А) г; {-пА/В,-пВ/А} 7. -.В -> -.А МР; 5, 6 8. А —> В Не ->В -> ->А 1-7 9. I-С (А -> В) -> (*нВ -4 ^А) теорема дедукции
116 Глава 4. Логические исчисления Доказательство теоремы в: Ьй А -4 (-В —> ->(А -4 В)) № Утверждение Обоснование 1. А гипотеза 2. А^В гипотеза 3. В МР; 1, 2 4. А, А-> В 1-х, В 1-3 5. А\-& (А-t В)В теорема дедукции 6. he А -> ((А -4 В) В) теорема дедукции 7. 1-й ((А чВ) 4 В) -4 -4 (->В ->(А В)) д; {А -4 В/А} 8. Нй А ЬВ -+ -.(А -4 В)) Сл. 2; {((А -4 В) -4 В)/В (-В^ЧЛ-4В))/С} Доказательство теоремы ж: !-£, (А -> В) -4 ((-А -4 В) -4 В). № 1. Утверждение А-> В Обоснование гипотеза 2. -А-4 В гипотеза 3. (А 4 В) 4 (-В -4 ->А) д 4. -B->-nA MP; 1, 3 5. (-А -4 В) -4 (-В -4 —А) Э; {-А/А} 6. -В -4 -.-nA МР; 2, 5 7. (~>В -,-,А) -4 ((“В -4 ->А) -4 А3;ЬА/А} В) 8. (~В -4 -нА) -4 В МР; 6, 7 9. в МР; 4, 8 10. А^ В,-Л-> В Ий В 1-9 И. А -4 В Ий (-Л -4 В) -4 в теорема дедукции 12. Нй (А^В)^(ЧА^В)^В) теорема редукции 4.3.8. Множество теорем теории £ Пусть формула А содержит переменные ах,..., ап, и пусть задана некоторая ин- терпретация I формулы А, то есть приписаны истинностные значения перемен- ным ai,..., ап. Обозначим 4>.= 1а<’ еслиа« = и д,._ Л если 1(A) = И если <ц = Л —.А, если 1(A) = Л в данной интерпретации ЛЕММА А\ ,А'пЬсА'. Доказательство Индукция по структуре формулы А.
4.3. Исчисление высказываний _______________________________117 1. Переменная. Пусть А = а. Тогда a I-& а и ->а 1-£ ~>а. 2. Отрицание. Пусть А = ~<В. ► Пусть 1(B) = И. Тогда 1(A) = Л и А' = ->А = ->->В. По индукционному предположению А\,...,А'п Нс. В. Но Нс В -> ->-*B по теореме 4.3.7, б, Следовательно, A'i,..., А'п Их ->-<В = А'. ► Пусть 1(B) = Л. Тогда 1(A) = И и А' = А - ->В. По индукционному предположению A'i,..., А'п Их ->В = А'. 3. Импликация. Пусть А = (В -4 С). По индукционному предположению A'i,..., А'п 1-х В' и А\,..., А'п С. ► Пусть 1(B) — Л. Тогда, независимо от значения 1(C), имеем: 1(A) = И и В' = ->В, А' = А. Но A'i,..., А'п Нх -,В, Нх ~‘В -4 (В С) по теореме 4.3.7, в, следователь- но, A'i,..., А'п Нс В -4 С = А'. ► Пусть 1(B) = И и 1(C) = И. Тогда 1(A) = И и С' = С, А' = А = В С. Имеем: A'i,..., А'п Их С, Их С -4 (В С) (аксиома Ах с подстановкой {С7/А}), следовательно, A'i,..., А'п Их В -4 С = А'. ► Пусть 1(B) = И и 1(C) = Л. Тогда А' = -А = -(В -4 С), В' = В и С = -^С. Имеем: A'i,...,A'n И В, A'i,...,A'n И С, 1~х В -4 (-С -4 -п(В -4 С)) по теореме 4.3.7, е. Следовательно, A'i,..., А'п Их ~'(В С) = А'. □ ТЕОРЕМА Теоремами теории £> являются общезначимые формулы и только они: Их А <==> А — тавтология. Доказательство 4=: Пусть А — тавтология. Тогда A'i,...,А'п Н А в любой интерпретации. Таким образом, имеется 2П различных выводимостей A'i,...,A'n Н А. Среди них есть две, которые различаются в А'п: A'i,..., A'n~i, ап I- А и A'i,..., A'n-i, ~<ап I- А. По теореме дедукции A'i,..., A'n-i Нс ап -> -А и A'i,...,A'n-i I--------,ап -4 А, но Нс (ап -4 А) -4 ((->ап -4 А) -4 А) по теореме 4.3.7(g), следовательно, A'i,..., A'n-i Н А. Повторив этот процесс еще п — 1 раз, имеем Их А. •==►: Аксиомы Ах, А2, Аз суть тавтологии. МР сохраняет тавтологичпость, сле- довательно, теоремы теории С суть тавтологии. □ СЛЕДСТВИЕ Теория £ формально непротиворечива. Доказательство Все теоремы L суть тавтологии. Отрицание тавтологии не есть тавтология. Сле- довательно, в С нет теоремы и ее отрицания. □
118 Глава 4. Логические исчисления 4.3.9. Другие аксиоматизации исчисления высказываний Теория £ не является единственной возможной аксиоматизацией исчисления высказываний. Ее основное достоинство — лаконичность при сохранении опре- деленной наглядности. Действительно, в теории £ всего две связки, три схемы аксиом и одно правило. Известны и многие другие аксиоматизации исчисления высказываний, предложенные различными авторами. 1. Гильберт и Аккерман, 1938. Связки: V,-, (A->B: = -nAvB). Аксиомы: AVA->A, A^-AvB, AV В -> В V А, (B->C)->(AvB-+AvC). Правило: Modus ponens. 2. Россер, 1953. Связки: (А->В: = ^(А&-гВ)). Аксиомы: A -> A&A, A&B->A, (A-tB)-t HB&C) -> ->(C& A)) Правило: Modus ponens. 3. Клини, 1952. Связки: V, — Аксиомы: A -+ (B -» A), (A -> (B -> C)) -> ((A -> B) (A -> C)), A&B->A, A&B->B, A-> (В-> (A&B)), A->(AvB), В -> (A VB), (A -> С) -4 ((B -> С) -» ((A V В) -+ C)), (A -> В) -> ((A -> -\B) -> -A), —A -> A. Правило: Modus ponens. 4. Никод, 1917. Связка: Аксиома: | (A | В: =->A V->B). (A | (B | C)) | ((B | (D | £>)) | |((B|B)|((A|B)|(A|B)))). Правило: A,A|(B|(7) C 4.4. Исчисление предикатов Описание формальной теории исчисления предикатов в этом разделе носит кон- спективный характер, в частности, многие технически сложные доказательства
4.4. Исчисление предикатов 119 опущены. В то же время уделено внимание прагматическим аспектам теории, то есть ответу на вопрос, что выразимо и что невыразимо в исчислении предикатов. 4.4.1. Определения (Чистое) исчисление предикатов (первого порядка) — это формальная теория X, в которой определены следующие компоненты. 1. Алфавит: связки основные -л -> дополнительные & V служебные символы ( , кванторы всеобщности V существования 3 предметные константы а,Ь,... ... переменные х,у,... ,Xi,yi,... предметные предикаты P,Q,... функторы С каждым предикатом и функтором связано некоторое натуральное число, которое называется арностью , или местностью. 2. Формулы имеют следующий синтаксис: (формула) :: = (атом) | (формула) | ((формула) -> (формула)) | V (переменная) (формула) | 3 (переменная) (формула) (атом) (список термов) (терм) :: = (предикат) ((список термов)) :: = (терм) | (терм), (список термов) :: = (константа) | (переменная) | (функтор)((список термов)) При этом должны быть выполнены следующие контекстные условия: в терме функтор f должен быть n-местным. В атоме (или атомарной формуле) P(ti,... ,tn) предикат Р должен быть п-местным. Вхождения переменных в атомарную формулу называются свободными. Сво- бодные вхождения переменных в формулах А и В остаются свободными в формулах ->А и А —» В. В формулах V а? А и 3 а? А формула А как правило имеет свободные вхождения Переменной х. Вхождения переменной х в фор- мулы V а? А и 3 а? А называются связанными. Вхождения других переменных (отличных от х), которые были свободными в формуле А, остаются свободны- ми и в формулах Vа? А и За? А. Одна и та же переменная может иметь в одной
120 Глава 4. Логические исчисления и той же формуле как свободные, так и связанные вхождения. Формула, не содержащая свободных вхождений переменных, называется замкнутой. Пример Рассмотрим формулу Va? (Р(а?) -> Зу Q(x,y)) и ее подформулы. В подформу- лу 3 у Q(a?,y) переменная х входит свободно, а оба вхождения переменной у связаны (квантором существования). Таким образом, эта подформула не за- мкнута. С другой стороны, то же самое вхождение переменной х в подформулу Q(x, у) является связанным вхождением в формуле Va? (Р(а?) -> Зу Q(x,y)). В этой формуле все вхождения всех переменных связаны, а потому формула замкнута. ЗАМЕЧАНИЕ............... ............... ................—---------- Язык теории £ не содержит кванторов, поэтому понятия свободного и связанного вхо- ждения переменных не применимы непосредственно. Обычно для удобства полагают, что все формулы теории £ замкнуты. Формулы вида А и ->А, где А — атом, называются литеральными формулами (или литералами). В формулах Vх А и 3 а? А подформула А называется областью действия кван- тора по х. Обычно связки и кванторы упорядочивают по приоритету следующим обра- зом: —V, 3, &, V, —Лишние скобки при этом опускают. Терм t называется свободным для переменной х в формуле А, если никакое свободное вхождение переменной х в формулу А не лежит в области действия никакого квантора по переменной у, входящей в терм t. В частности, терм t свободен для любой переменной в формуле А, если никакая переменная терма не является связанной переменной формулы А. Пример 1. Терм у свободен для переменной х в формуле Р(х), но тот же терм у не свободен для переменной х в формуле У у Р(х). 2. Терм f(x,z) свободен для переменной х в формуле Vу Р(х,у) —> Q(x), но тот же терм /(a?, z) не свободен для переменной х в формуле ЗгУу Р(х,у) -> Q(x). 3. Аксиомы (логические): любая система аксиом исчисления высказываний, плюс Pi: V х А(а?) —» A(t), Р2: A(t) -> За? А(х), где терм t свободен для переменной х в формуле А.
4.4. Исчисление предикатов 121 4. Правила вывода: А, А -> В , В -> А(х) , А(х) -> В , ---------------------------Modus ponens, ---------- \ ; V+, —-— 3+, В-----------------------------------------------------В-*ЧхА(х) ЭхА(х)-*В где формула А содержит свободные вхождения переменной х, а формула В их не содержит. Исчисление предикатов, которое не содержит предметных констант, функторов, предикатов и собственных аксиом, называется чистым. Исчисление предикатов, которое содержит предметные константы и/или функторы и/или предикаты и связывающие их собственные аксиомы, называется прикладным. Исчисление предикатов, в котором кванторы могут связывать только предмет- ные переменные, но не могут связывать функторы или предикаты, называется исчислением первого порядка. Исчисления, в которых кванторы могут связывать не только предметные переменные, но и функторы, предикаты или иные множе- ства объектов, называются исчислениями высших порядков. Практика показывает, что прикладного исчисления предикатов первого поряд- ка оказывается достаточно для формализации содержательных теорий во всех разумных случаях. 4.4.2. Интерпретация Интерпретация I (прикладного) исчисления предикатов X с областью интер- претации (или носителем) М — это набор функций, которые сопоставляют ► каждой предметной константе а элемент носителя /(a), 1(a) € М; ► каждому n-местному функтору f операцию 1(f) на носителе, 1(f): Мп -> М; ► каждому n-местному предикату Р отношение 1(Р) на носителе, 1(Р) с Мп. Пусть х = (xi,...) — набор (последовательность) переменных (входящих в фор- мулу), a s = (sx,...) — набор значений из М. Тогда всякий терм f(ti,...,tn) имеет значение на s (из области М), то есть существует функция s*: {£} М, определяемая следующим образом: s*(a) : = I(a), s*(Xi) : = Si, s*(f(ti,... ,tn)) -.^(f)^),..., з*(^)). Всякий атом P(ti,... ,tn) имеет на s истинностное значение s*(P), определяемое следующим образом: s*(P(ii, • • • ,tn)): =(s*(ti), , s*(tn)) e I(P). Если s*(P) = И, то говорят, что формула P выполнена на s. Формула -iА выполнена на s тогда и только тогда, когда формула А не выполнена на s. Формула А —> В выполнена на s тогда и только тогда, когда формула А не выполнена на s или формула В выполнена на s.
122 Глава 4. Логические исчисления Формула У Xi А выполнена на s тогда и только тогда, когда А выполнена на любом наборе s', отличающемся от з, возможно, только i-м компонентом. Формула Вхг А выполнена на з тогда и только тогда, когда А выполнена на каком-либо наборе s', отличающемся от з, возможно, только г-м компонентом. Формула называется истинной в данной интерпретации I, если она выполнена на любом наборе з элементов М. Формула называется ложной в данной интер- претации I, если она не выполнена ни на одном наборе з элементов М. Интерпретация называется моделью множества формул Г, если все формулы из Г истинны в данной интерпретации. Всякая замкнутая формула истинна или ложна в данной интерпретации. Откры- тая (то есть не замкнутая) формула А(ж, у, z,...) истинна в данной интерпрета- ции тогда и только тогда, когда ее замыкание Vх Уу Уz- • • Л(ж, у, z,...) истинно в данной интерпретации. Это обстоятельство объясняет, почему собственные ак- сиомы прикладных теорий обычно пишутся в открытой форме. 4.4.3. Общезначимость Формула (исчисления предикатов) общезначима, если она истинна в любой ин- терпретации. ТЕОРЕМА Формула Ух А (ж) —> A(t), где терм t свободен для переменной х в формуле А, общезначима. Доказательство Рассмотрим произвольную интерпретацию I, произвольную последовательность значений из области интерпретации з и соответствующую функцию з*. Пусть s*(ti) = и пусть t(ir) — некоторый терм, a t1: = t(.. .х.. /х}. Тогда s*(t) = sj(t'), где sj имеет значение на месте х. Пусть А(ж) — формула, а терм t свободен для х в А. Положим A(t): = A(...:r...){t/M Имеем: s*(A(t)) = И <=> 31(А(ж)) = И, где si имеет значение s*(t) на месте х. Если з*(Ух А(ж)) = И и терм t свободен для х в А, то s*(A(t)) = И. Сле- довательно, формула Ух А(х) -> A(t) выполнена на всех последовательностях в произвольной интерпретации. □ ЗАМЕЧАНИЕ................. ......................................... Можно показать, что формула A(t) -> 3 х А(х), где терм t свободен для переменной х в формуле А, общезначима. 4.4.4. Полнота чистого исчисления предикатов Следующие две метатеоремы устанавливают свойства исчисления предикатов, аналогичные тем, которые установлены для исчисления высказываний в подраз- деле 4.3.8. Теоремы приводятся без доказательств, которые технически довольно сложны.
4.4. Исчисление предикатов 123 ТЕОРЕМА Всякая теорема чистого исчисления предикатов первого порядка об- щезначима. ТЕОРЕМА Всякая общезначимая формула является теоремой чистого исчисле- ния предикатов первого порядка. 4.4.5. Логическое следование и логическая эквивалентность Формула В является логическим следствием формулы А (обозначение: А => В), если формула В выполнена на любом наборе в любой интерпретации, на котором выполнена формула А. Формулы А и В логически эквивалентны (обозначение: А = В), если они являются логическим следствием друг друга. Имеют место следующие логические следования и эквавалентности: 1. -Ух А(я) = Зя ->А(я), 2. Ух (А(я)&В(я)) = Уя А{х)&.Ух В(х), 3. Зя (А(я) & В(я)) => Зя А(я)&Эя В(х~), 4. Vх Vу А(х, у) — УуУх А(х, у), 5. Ух (А(х) &;С) = У я А(х) С, 6. Зя (А(я)&С) = Зя А(х)&С, 7. С -4Ух А(х) =Ух{С^ А(х)), 8. Ух А(х) -4 С ==> Зя (А(я) -4 С), -Зя А(я) = Ух -А(я), Зя (А(я)УВ(я)) = = 3$ А(я) V Эя В(я), Ух А(я) У Ух В{х) => => Ух (А(я) V В(я)), Эя Зу А(я,у) — By Зя А(х,у), Ух (А(я) V С) = Ух А(я) V С, Зя (А(я)УС) = 3я А(я)УС, С -4 Зя А(я) — Зя (С -> А(я)), Эя А(я) -4 С => Ух (А(я) -4 С), где формула С не содержит никаких вхождений переменной я. Для всякой формулы А существует логически эквивалентная ей формула А' в предваренной форме: А . — Qi Х\... Qn хп А(я^,..., яп), где Qi,...,Qn — некоторые кванторы, а А — бескванторная формула. 4.4.6. Теория равенства Теория равенства £— это прикладное исчисление предикатов, в котором имеются: 1. Собственный двухместный предикат — (инфиксная запись я — у). 2. Собственные аксиомы (схемы аксиом): Еу: Ух х = я, е2 : (я - у) -> (А(я) -> А(я){у/я}). ТЕОРЕМА В теории £. выводимы следующие теоремы: 1. |-£ t — t для любого терма t, 2. 1~Е я = у —> У = X,
124 Глава 4. Логические исчисления 3. 1-£ х = у -> (у = Z -> х - z). Доказательство 1. Из Ei и Pi по МР. 2. Имеем: (ж = у) —> (ж = х —> у = х) из Е2 при подстановке {ж = ж/А(ж)}. Значит, х = у, х = х t-£ у = х. Но h-£ х = х, следовательно, х = у Ь£ у = х. По теореме дедукции \~е х = у —> у = х. 3. Имеем: у = х —> (у = z —> х = z) из Е2 при подстановке {у/х,х/у}, значит, у = х I—£ (у = z —> х = z). Но х = у 1-£ у = х, по транзитивности х = у h-£ (у = z -> х = z), по теореме дедукции 1-£ {х — у) —> (у = z —> х = z). □ Таким образом, равенство является эквивалентностью. Но равенство — это более сильное свойство, чем эквивалентность. Аксиома Е2 выражает неотличимость равных элементов. 4.4.7. Формальная арифметика Формальная арифметика А — это прикладное исчисление предикатов, в котором имеются: 1. Предметная константа 0. 2. Двухместные функторы + и •, одноместный функтор 3. Двухместный предикат =. 4. Собственные аксиомы (схемы аксйом): Ai: (Р(0) & Ух (Р(ж) -> Р(х'))) -+ Ух Р(ж), А.2 tl' = ^2* —> 11 — р2> Аз: -(t' = 0), А4: tj = tj —> (tj = /3 —> tj — 4з), As: ti = ta —> ti = ta', Aq : t + 0 — t, A7: ti + taz = (ti + ta)'» A8: t-0 = 0, Ag: ti taz — ti t2 + ti, где P — любая формула, a — любые термы теории A. 4.4.8. Теория (абелевых) групп Теория групп S — это прикладное исчисление предикатов с равенством, в котором имеются: 1. Предметная константа 0. 2. Двухместный функтор +.
4.4. Исчисление предикатов 125 3. Собственные аксиомы (схемы аксиом): Gj: Ух, у, z (у + z) = (х + у) + z, G2: V х 0 + х = х, G3: Vх Зу х + у = 0. ЗАМЕЧАНИЕ----------------------------------------------------------- Выражение «теория первого порядка с равенством» означает, что подразумевается нали- чие предиката -, аксиом Ei и Е? и всех их следствий. Группа называется абелевой, если имеет место собственная аксиома G4: V х, у х + у = у + х. Абелева группа называется группой конечного порядка п„ если выполнена соб- ственная аксиома G5: V х 3 к п кх = 0, где кх — это сокращение для х+х -I-1-х (к слагаемых). Эта формула не является формулой теории 8, поскольку содержит «посторон- ние» предметные предикаты и переменные. Однако для любого конкретного ко- нечного п собственная аксиома может быть записана в виде допустимой формулы теории S: G5: Ух (ж = 0 V 2х — 0 V ... V пх = 0). Абелева группа называется полной, если выполнена собственная аксиома Ge- Уп^1УхЗупу = х. Эта формула не является формулой теории 8, поскольку содержит «посторон- ние» предметные константы и переменные. Однако собственная аксиома может быть записана в виде бесконечного множества допустимых формул теории 8: G'e: V х 3 у 2у = х, У/Х Зу Зу = х, Но любое конечное множество формул, истинное во всех полных абелевых груп- пах, истинно и в некоторой неполной абелевой группе, то есть теория полных абелевых групп не является конечно аксиоматизируемой. Абелева группа называется периодической, если выполнена собственная аксиома Gy. Ух Зп 1 пх = 0. Эта формула не является формулой теории 9, поскольку содержит «по- сторонние» предметные константы и переменные. Если попытаться пре- образовать формулу Gy по образцу формулы Ge, то получится бесконечная «формула»
126 Глава 4. Логические исчисления Gg: У в (х = О V 2х = О V .... V та = О V ,....), которая не является допусти- мой формулой исчисления предикатов и тем более теории 9- Таким обра- зом^ периодическая абелева группа не является аксиоматизируемой (если не включать в теорию групп и всю формальную арифметику). ОТСТУПЛЕНИЕ-------------------------------------------------------- Наличие неаксиоматизируемых и конечно неаксиоматизируемых формальных теорий не означает практической неприменимости аксиоматического метода. Это означает, что акси- оматический метод не применим «в чистом виде». На практике формальные теории, опи- сывающие содержательные объекты, задаются с помощью собственных аксиом, которые наряду с собственными предикатами и функторами содержат «внелогические» предикаты и функторы, свойства которых аксиомами не описываются, а считаются известными (в данной теории). В рассмотренных примерах подраздела 4.4.8 внелогическими являются натуральные числа и операции над ними. Аналогичное обстоятельство имеет место и в системах логического программирования типа Пролог. Реализация такой системы все- гда снабжается обширной библиотекой внелогических (или встроенных) предикатов и функторов, которые и обеспечивают практическую применимость системы логического программирования. 4.4.9. Теоремы Гёделя о неполноте В настоящее время точно известны некоторые важные свойства формальных тео- рий, в частности, прикладных исчислений предикатов первого порядка, которые существенным образом влияют на практическую применимость формальных те- орий (аксиоматичского метода). Полное изложение этих фактов выходит далеко за рамки данного учебника. Поэтому ниже приводятся для сведения (без доказа- тельства и в упрощенной формулировке) два важнейших факта, известные как теоремы Гёделя1 о неполноте. Аксиоматический метод обладает множеством достоинств и с успехом применя- ется на практике для формализации самых разнобразных предметных областей в математике, физике и других науках. Однако этому методу присуще следующее принципиальное ограничение. ТЕОРЕМА (Первая теорема Гёделя о неполноте) Во всякой достаточно богатой теории первого порядка (в частности, во всякой теории, включающей формаль- ную арифметику), существует такая истинная формула F, что ни F, ни -F не являются выводимыми в этой теории. Утверждения о теории первого порядка также могут быть сформулированы в ви- де формул теории первого порядка. В частности, утверждения о свойствах фор- мальной арифметики могут быть сформулированы как арифметические утвер- ждения. 1Курт Гёдель (1906-1978)
4.5. Автоматическое доказательство теорем 127 ТЕОРЕМА (Вторая теорема Гёделя о неполноте) Во всякой достаточно богатой теории первого порядка (в частности, во всякой теории, включающей формальную арифметику), формула F, утверждающая непротиворечивость этой теории, не является выводимой в ней. ОТСТУПЛЕНИЕ---------------------------------------------------------- Вторая теорема Геделя не утверждает, что арифметика противоречива. (Формальная ариф- метика из примера 4.4.7 как раз непротиворечива.) Теорема Гёделя утверждает, что не- противоречивость достаточно богатой формальной теории не может быть установлена средствами самой этой теории (см. еще раз следствие к теореме 4.3.8). При этом вполне может статься, что непротиворечивость одной конкретной теории может быть установле- на средствами другой, более мощной формальной теории. Но тогда возникает вопрос о непротиворечивости этой второй теории и т. д. 4.5. Автоматическое доказательство теорем Автоматическое доказательство теорем — это краеугольный камень логического программирования, искусственного интеллекта и других современных направле- ний в программировании. Здесь излагаются основы метода резолюций — клас- сического и в то же время популярного метода автоматического доказательства теорем. 4.5.1. Постановка задачи Алгоритм, который проверяет отношение гь-s для формулы S, множества формул Г, и теории Т называется алгоритмом авто- матического доказательства теорем. В общем случае такой алгоритм невозмо- жен, то есть не существует алгоритма, который для любых S', Г и Т выдавал бы ответ «Да», если Г h-g- S, и ответ «Нет», если неверно, что Г h-g- S. Более того, известно, что нельзя построить алгоритм автоматического доказательства теорем даже для большинства конкретных достаточно сложных формальных теорий 7. В некоторых случаях удается построить алгоритм автоматического доказатель- ства теорем, который применим не ко всем формулам теории (то есть частичный алгоритм, см. подраздел 4.2.5). Для некоторых простых формальных теорий (например исчисление высказыва- ний) и некоторых простых классов формул (например прикладное исчисление предикатов с одним одноместным предикатом) алгоритмы автоматического до- казательства теорем известны. Пример Поскольку для исчисления высказываний известно, что теоремами являются об- щезначимые формулы, можно воспользоваться простым методом проверки об- щезначимости формулы с помощью таблиц истинности. А именно, достаточно
128 Глава 4. Логические исчисления вычислить истинностное значение формулы при всех возможных интерпретаци- ях (их конечное число). Если во всех случаях получится значение И, то прове- ряемая формула — тавтология, и, следовательно, является теоремой теории £. Если же хотя бы в одном случае получится значение Л, то проверяемая формула не является тавтологией и, следовательно, не является теоремой теории £. ЗАМЕЧАНИЕ----------------------------------------------------—- Приведенный выше пример является алгоритмом автоматического доказательства теорем в теории £, хотя и не является алгоритмом автоматического поиска вывода теорем из аксиом теории £. Наиболее известный классический алгоритм автоматического доказательства те- орем называется методом резолюций. Для любого прикладного исчисления пре- дикатов первого порядка J, любой формулы S и множества формул Г теории 7 метод резолюций выдает ответ «Да», если Г Hr S', и выдает ответ «Нет» или не выдает никакого ответа (то есть зацикливается), если неверно, что Г hg- S. 4.5.2. Доказательство от противного В основе метода резолюций лежит идея «доказательства от противного», ТЕОРЕМА Если Г, -Е! I- F, где F — любое противоречие (тождественно ложная формула), moVr S. Доказательство (Для случая £.) Г, -<S I- F <=> Г&->5' -> F — тавтология. Но Г&-5 ->F = ^(r&-S)VF = -(r&^S) = -rv5 = r->S. Имеем: Г -> S — тавтология <=> Г I- S. □ Пустая формула не имеет никакого значения ни в какой интерпретации, в част- ности, не является истинной ни в какой интерпретации и, по определению, явля- ется противоречием. В качестве формулы ^ при доказательстве от противного по методу резолюций принято использовать пустую формулу, которая обознача- ется □. 4.5.3. Сведение к предложениям Метод резолюций работает с особой стандартной формой формул, которые на- зываются предложениями. Предложение — это бескванторная дизъюнкция ли- тералов. Любая формула исчисления предикатов может быть преобразована в множество предложений следующим образом (здесь знак => используется для обозначения способа преобразования формул).
4.5. Автоматическое доказательство теорем 129 1. Элиминация импликации. Преобразование: А —> В => -А V В. После первого этапа формула содержит только V, &, V, 3. 2. Протаскивание отрицаний. Преобразования: -Ух А => Зя: -A, -dz А => => Vх -.А, —А => А, -.(А V В) => -nA & -.В, ->( А & В) => -А V ->В. После второго этапа формула содержит отрицания только перед атомами. 3. Разделение связанных переменных. Преобразование: <21 х А(... Q2 х В(... х...)...) =>Qi х А(... Q2 у В(... у...)...), где Qi и Q2 — любые кванторы. После третьего этапа формула не содержит случайно совпадающих связанных переменных. 4. Приведение к предваренной форме. Преобразования: Qx А V В => Qx (А V В), Qx А&В => Qx (АкВ), где Q — любой квантор. После четвертого этапа формула находится в предва- ренной форме. 5. Элиминация кванторов существования (сколемизация). Преобразования: 3.^1 Q2 Х2 . . . Qn Хп А(Ж1, Х2 . . . , Хп) — z Q2 Х2 . ... Qn Хп A(fl, . . . , Х-пф VXi ... VХ^—i 3 Xi Qi+iXi-f-i . . . Qn XnA^Z|,. . . , Xi,. . . , Xn) • • < =>Vxi ... Vxi-iQi+i xi+i ...Qn xnA(xi,..., f(xi,..., Xi-1), ...,Xn), где a — новая предметная константа, f — новый функтор, a Qi, Q2,..., Qn — любые кванторы. После пятого этапа формула содержит только кванторы все- общности. 6. Элиминация кванторов всеобщности. Преобразование: Ух А(ж) ==> А(ж). После шестого этапа формула не содержит кванторов. 7. Приведение к конъюнктивной нормальной форме. Преобразование: AV(B&C) => (А V В) &(А V С), (А&В) VС => (A VC)&(В VС). После седьмого1 этапа формула находится в конъюнктивной нормальной форме. 8. Элиминация конъюнкции. Преобразование: А & В ==> А, В. После восьмого этапа формула распадается на множество предложений. Не все преобразования на этапах 1-8 являются логически эквивалентными. ТЕОРЕМА Если Г — множество предложений, полученных из формулы S, то S является противоречием тогда и только тогда, когда множество Г невыполнимо. Доказательство В доказательстве нуждается шаг 5 — сколемизация. Пусть В — VXi ... VXi—i' 3 XiQi+iXi-i-i . . . Qn&n A(Xj, . . . , Xn) Положим F' :=УУXi . ..yx^i Qi+iXi+i... QnxnA(xi,.. .,Xi~i,f(xi,... ,Xi-i),xi+i,.. .,xn).
130 Глава 4. Логические исчисления Пусть Fпротиворечие^a F' — не противоречие. Тогда существует интерпре- тация I и набор значений s = (aj,. ai+1,an), такой что s*(F') = И. Положим ai: = /(dj,..., сч_1), sj: =(aj,..., a^i, аг, ai+i,..., an). Тогда sj (F) = И и F — выполнимая формула. □ ЗАМЕЧАНИЕ----------------------------------------------------- Множество формул Г невыполнимо — это означает, что множество Г не имеет модели, то есть не существует интерпретации, в которой все формулы Г имели бы значение И. 4.5.4. Правило резолюции для исчисления высказываний Пусть Сг и Ci — два предложения в исчислении высказываний, и пусть Су = Р V Ср а Ci = -1Р V С2, где Р — пропозициональная переменная, а С{, С2 — любые предложения (в частности, может быть, пустые или состоящие только из одного литерала). Правило вывода ^1. С2 п С'^С'г называется правилом резолюции. Предложения Сд и Ci называются ревальвируе- мыми (или родительскими), предложение С'г V С2 — резольвентой, а формулы Р и -1Р — контрарными литералами. Правило резолюции — это очень мощное правило вывода. Многие ранее рассмо- тренные правила являются частными случаями правила резолюции: ———----Modus ponens ----j--—---Транзитивность A —С/ AVB,A-> В -----------Слияние A, -.A V В n —в—R AvB,^BvC ~^AVC R AV B,->AV В —~p----R ТЕОРЕМА Правило резолюции логично, то есть резольвента является логическим следствием ревальвируемых предложений. Доказательство Пусть ПС-i) = И и I(Ci) — И. Тогда, если /(Р) = И, то С2 / 0 и 1{С2) = И, а значит, /(С{ V С2) = И. Если же 1(Р) = Л, то С'г / 0 и /(CJ) = И, а значит, /(C'VC£) = H. □ ЗАМЕЧАНИЕ —----------------------------------------------------- Резольвента является предложением.
4.5. Автоматическое доказательство теорем 131 4.5.5. Правило резолюции для исчисления предикатов Для применения правила резолюции нужны контрарные литералы в резольвиру- емых предложениях. Пусть q и q — два предложения в исчислении предикатов. Правило вывода Ci, R (q V Cfr называется правилом резолюции в исчислении предикатов, если в предложени- ях q и Ci существуют унифицируемые контрарные литералы Рг и Р2, то есть q — Pi V q и С2 = ~Р2 V q, причем атомарные формулы Pi и Р2 являются унифицируемыми наиболее общим унификатором а. В этом случае резольвентой предложений q и С2 является предложение (q V С2)сг, полученное из предло- жения. q V С2 применением унификатора ст. 4.5.6. Опровержение методом резолюций Опровержение методом резолюций — это алгоритм автоматического доказатель- ства теорем в прикладном исчислении предикатов, который сводится к следую- щему. Пусть нужно установить выводимость SV-G. Каждая формула множества S и формула (отрицание целевой теоремы) не- зависимо преобразуются в множества предложений. В полученном совокупном множестве предложений С отыскиваются резольвйруемые предложения, к ним применяется правило резолюций и резольвента добавляется в множество до тех пор, пока не будет получено пустое предложение. При этом возможны три слу- чая: 1. Среди текущего множества предложений нет резольвируемых. Это означает, что теорема опровергнута, то есть формула G не выводима из множества фор- мул S. 2. В результате очередного применения правила резолюции получено пустое предложение. Это означает, что теорема доказана, то есть S I- G. 3- Процесс не заканчивается, то есть множество предложений пополняется всё новыми резольвентами, среди которых нет пустых. Это ничего не означает. ЗАМЕЧАНИЕ-------------------------------------------------------— Таким образом, исчисление предикатов является полуразрешимой теорией, а метод резо- люций является частичным алгоритмом автоматического доказательства теорем. Пример Докажем методом резолюций теорему hx (((А -> В) -> А) -> А). Сначала нужно преобразовать в предложения отрицание целевой формулы n(((A->B)-U)-U).
132 Глава 4. Логические исчисления 1. -bH-AV-B) VA)VA). 2. (((А&-В) V4)&^4), 3-6. Формула без изменений. 7. (А V А) V А) & 8. А V A,-<В V А, —1Д. После этого проводится резрльвирование имеющихся предложений 1-3. 1. А V А. 2. ->BVA. 3. ->А. 4. А из 1 и 3 по правилу резолюции. 5. □ из 3 и 4 по правилу резолюции. Таким образом, теорема доказана. 4.5.7. Алгоритм метода резолюций Алгоритм поиска опровержения методом резолюций проверяет выводимость формулы G из множества формул S. Алгоритм 4.2. Метод резолюций Вход: множество предложений С, полученных из множества формул S и формулы -G. Выход: 1 — если G выводимо из S', 0 — в противном случае. М: = С { М ~ текущее множество предложений } while □ М do Choose(M,ci,C2,Pi,P2,<t) { выбор родительских предложений } if ci, С2 = 0 then return 0 { нечего резольвировать } end if с: = Я(с1,С2,Р1,р2,<т) { вычисление резольвенты } М: = М U {с} { пополнение текущего множества } end while return 1 { теорема доказана } Обоснование Если алгоритм заканчивает свою работу, то правильность результата очевидным образом следует из теорем предшествующих разделов. Вообще говоря, заверша- емость этого алгоритма не-гарантирована. □ В этом алгоритме использованы две вспомогательные функции. Функция R вы- числяет резольвенту двух предложений сх и сг, содержащих унифицируемые контрарные' литералы рх и рз, соответственно; при этом <т — наиболее общий унификатор. Результатом работы функции является резольвента. Процедура Choose выбирает в текущем множестве предложений М два резоль- вируемых предложения, то есть два предложения, которые содержат унифици- руемые контрарные литералы. Если таковые есть, то процедура их возвращает,
Упражнения 133 в противном случае возвращается пустое множество. Конкретные реализации процедуры Choose называются стратегиями метода резолюций. ЗАМЕЧАНИЕ------------------------------------------------------------- В настоящее время предложено множество различных стратегий метода резолюций. Среди них различаются полные и неполные стратегии. Полные стратегии — это такие, которые гарантируют нахождение доказательства теоремы, если оно вообще существует. Непол- ные стратегии могут в некоторых случаях не находить доказательства, зато они работают быстрее. Следует иметь в виду, что автоматическое доказательство теорем методом резо- люций имеет по существу переборный характер, и этот перебор столь велик, что может быть практически неосуществим за приемлемое время. ОТСТУПЛЕНИЕ------------------------------------------------------ При автоматическом доказательстве теорем методом резолюций львиная доля вычисле- ний приходится на поиск унифицируемых предложений. Таким образом, эффективная реализация алгоритма унификации критически важна для практической применимости метода резолюций. Комментарии Здесь изложены элементарные сведения из математической логики, причем тех- нически сложные доказательства опущены. Более подробное изложение можно, найти в многочисленных классических учебниках, например [15]. Классическое описание автоматического доказательства теорем методом резолюций имеется в [24]. Эта книга содержит описание различных стратегий и усовершенствова- ний метода резолюций, а также многочисленные примеры применений. Алгорит- мы 4.3.3 и 4.5.7 являются упрощенными модификациями алгоритмов, описанных В [24]. Упражнения 4.1. Пусть х = у: = х уку х. Доказать, что формула £, содержащая только связку =, является тавтологией тогда и только тогда, когда каждая перемен- ная входит в нее четное число раз. 4.2. Описать процедуру, которая перечисляет множество термов для заданных конечных множеств переменных, констант и функторов. 4.3. Пусть ► формула А теории £ — не тавтология. ► А — множество всех частных случаев А. ► £+: = £иЛ. Доказать, цто £+ противоречива, то есть, что )-£,+ В и Ьс+ -В. 4.4. Доказать, что формула (Vx А(х) —> Wx В(х)) -> (Va; (А(а:) -> В(х))) об- щезначима. 4.5. Доказать методом резолюций: Ьд, А -> (В -> А&.В).
ГЛАВА 5 Комбинаторика Предмету комбинаторики не так просто дать краткое исчерпывающее определе- ние. В некотором смысле слово «комбинаторика» можно понимать как синоним термина «дискретная математика», то есть исследование дискретных конечных математических структур. На школьном уровне с термином «комбинаторика» связывают просто набор известных формул, служащих для вычисления так назы- ваемых комбинаторных чисел, о которых идет речь в первых разделах этой главы. Может показаться, что эти формулы полезны только для решения олимпиадных задач и не имеют отношения к практическому программированию. На самом деле это далеко не так. Вычисления на дискретных конечных математических струк- турах, которые часто называют комбинаторными вычислениями, требуют комби- наторного анализа для установления свойств и выявления оценки применимости используемых алгоритмов. Рассмотрим элементарный жизненный пример. Пример Пусть некоторое агентство недвижимости располагает базой данных из п запи- сей, причем каждая запись содержит одно предложение (что имеется) и один запрос (что требуется) относительно объектов недвижимости. Требуется найти все такие пары записей, в которых предложение первой записи совпадает с запро- сом второй, и, наоборот, предложение второй записи совпадает с запросом пер- вой. (На бытовом языке это называется подбором вариантов обмена.) Допустим, что используемая СУБД позволяет проверить вариант за одну миллисекунду. Нетрудно сообразить, что при «лобовом» алгоритме поиска вариантов (каждая запись сравнивается с каждой) потребуется п(п — 1)/2 сравнений. Если п = 100, то все в порядке — ответ будет получен за 4,95 секунды. Но если п = 100 000 (более реальный случай), то ответ будет получен за 4 999 950 секунд, что соста- вляет без малого 1389 часов и вряд ли может считаться приемлемым. Обратите внимание, что мы оценили только трудоемкость подбора прямых вариантов, а существуют еще варианты, когда число участников сделки больше двух ...
5.1. Комбинаторные конфигурации 135 Этот пример показывает, что комбинаторные вычисления требуют предваритель- ного анализа и количественной оценки исходных задач и используемых алго- ритмов. Задачи обычно оцениваются с точки зрения размера, то есть общего количества различных вариантов, среди которых нужно найти решение, а алго- ритмы оцениваются с точки зрения сложности. При этом различают сложность по времени (или временную сложность), то есть количество необходимых шагов алгоритма, и сложность по памяти (или ёмкостную сложность), то есть объем памяти, необходимый для работы алгоритма. Во всех случаях основным инструментом такого анализа оказываются формулы и методы, рассматриваемые в этой главе. 5.1. Комбинаторные конфигурации Во многих практических случаях возникает необходимость подсчитать количе- ство возможных комбинаций объектов, удовлетворяющих определенным усло- виям. Такие задачи называются комбинаторными: Разнообразие комбинаторных задач не поддается исчерпывающему описанию, но среди них есть целый ряд особенно часто встречающихся, для которых известны способы подсчета. 5.1.1. Комбинаторные задачи Для формулировки и решения комбинаторных задач используются различные модели комбинаторных конфигураций. Рассмотрим следующие две наиболее по- пулярные. 1, Дано п предметов. Их нужно разместить по т ящикам так, чтобы выполнялись заданные ограничения. Сколькими способами это можно сделать? 2. Рассмотрим множество функций F: X—>Y, где |Х| = п, |У| = т, Х = {1,...,п}. Не ограничивая общности, можно считать, что Y = {l,...,m}, F = (F(l),... ,F(n)), l^F(i)^m. Сколько существует функций F, удовлетворяющих заданным ограничениям? ЗАМЕЧАНИЕ-------------------------------------------------------- Большей частью соответствие конфигураций, описанных на «языке ящиков» и на «язы- ке функций», очевидно, поэтому доказательство правильности способа подсчета (вывод формулы) можно провести на любом языке. Если сведение одной модели к другой не очевидно, то оно включается в доказательство. 5.1..2 . Размещени Число всех функций (при отсутствии ограничений), или число всех возможных способов разместить п предметов по т ящикам называется, числом размещений и обозначается U(m,n).
136 Глава 5. Комбинаторика ТЕОРЕМА U(m, п) = тп Доказательство Каждый из п предметов можно разместить т способами. Пример При игре в кости бросаются две кости и выпавшие на верхних гранях очки скла- дываются. Какова вероятность выбросить 12 очков? Каждый возможный исход соответствует функции F: {1,2} {1,2,3,4,5,6} (аргумент — номер кости, ре- зультат — очки на верхней грани). Таким образом, всего возможно £7(6,2) = 62 = 36 различных исходов. Из них только один (6 + 6) дает двенадцать очков. Вероятность 1/36. 5.1.3. Размещения без повторений Число инъективных функций, или число всех возможных способов разместить п предметов по т ящикам, не более чем по одному в ящик, называется числом размещений без повторений и обозначается Л(т, п) или [m]n, или (гп)п. пг! ТЕОРЕМА А(т, п) = -------г: (пг —п)! Доказательство Ящик для первого предмета можно выбрать т способами, для второго — т — 1 способами, и т. д. Таким образом, тп\ А(т, п) = пг • (пг — 1) •... • (пг — n + 1) = --——. □ (пг — п)! По определению считают, что А(пг, п): = О при п > т и А(т, 0): = 1 Пример В некоторых видах спортивных соревнований исходом является определение участников, занявших первое, второе и третье места. Сколько возможно раз- личных исходов, если в соревновании участвуют п участников? Каждый воз- можный исход соответствует функции F: {1,2,3} -> {1..п} (аргумент — номер призового места, результат — номер участника). Таким образом, всего возможно А(п, 3) = п(п — 1)(п — 2) различных исходов. 5.1.4. Перестановки Число взаимнооднозначных функций, или число перестановок п предметов, обо- значается Р(п).
5. Комбинаторные конфигурации 137 ТЕОРЕМА Р(п) = п! Доказательство Р(п) — А(п, п) — п • (п — 1) • (п — п + 1) = п • (« — 1) 1 = п!. □ Пример Последовательность £ = (Ei,... ,Ет) непустых подмножеств множества Е (£ С 2е, Ei С Е, Ei^ 0) называется цепочкой в Е, если Vi € 1..т — 1 Ei С Ei Ei+i- Цепочка £ называется полной цепочной в Е, если |£| = Сколько существует полных цепочек? Очевидно, что в полной цепочке каждое следующее подмноже- ство Ei+1 получено из предыдущего подмножества Ei добавлением ровно одного элемента из Е и, таким образом, |ЕХ | = 1, |£?2| = 2, ..., |Ет| = |Е| = т. Следова- тельно, полная цепочка определяется порядком, в котором элементы Е добавля- ются для образования очередного элемента полной цепочки. Отсюда количество полных цепочек — это количество перестановок элементов множества Е, рав- ное т!. 5.1.5. Сочетания Число строго монотонных функций, или число размещений п неразличимых предметов по т ящикам, не более чем по одному в ящик, то есть число способов выбрать из т ящиков п ящиков с предметами, называется числом сочетаний и обозначается С(т,п) или С™ или (”). ТЕОРЕМА С(т, п) = —--------- n!(m — п)! Доказательство 1. Число размещений без повторений нужно разделить на число перестановок, поскольку предметы неразличимы. 2. Число сочетаний является числом строго монотонных функций, потому что строго монотонная функция F: 1..п -> 1..т определяется набором своих зна- чений, причем 1 < F(l) < • • • < F(n) < т. Другими словами, каждая строго монотонная функция определяется выбором п чисел из диапазона 1..т. Та- ким образом, число строго монотонных функций равно числу «-элементных подмножеств m-элементного множества, которое, в свою очередь, равно числу способов выбрать п ящиков с предметами из т ящиков. О По определению С(т, п): = 0 при п > т.
138 Глава 5. Комбинаторика Пример В начале игры в домино каждому играющему выдается 7 костей из имеющихся 28 различных костей. Сколько существует различных комбинаций костей, которое игрок может получить в начале игры? Очевидно, что искомое число равно числу 7-элементных подмножеств 28-элементного множества. Имеем: 28! 28 • 27 • 26 • 25 • 24 • 23 • 22 С(28’7)~ 7Ц28-7)! “ 7-6-5-4-3-2-1 ~ 1184040 5.1.6. Сочетания с повторениями Число монотонных функций, или число размещений п неразличимых предме- тов по тп ящикам, называется числом сочетаний с повторениями и обозначается V(m, п). ТЕОРЕМА V(m,n) = C(n + m- п) Доказательство Монотонной функции f: {1,..., п} -> {1,..., т} однозначно соответствует стро- го монотонная функция {1,...,п} {1,... ,п + т - 1}. Это соответствие устанавливается следующей процедурой. /'(1): = /(1) { первые элементы совпадают } for i from 2 to n do if f (i) = f (i - 1) then f'(i): = f'(i — 1) + 1 { плато } else /'(’) : = /'(»- 1) + /(») “ /(» - 1) { подъем } end if end for Пример Сколькими способами можно рассадить п вновь прибывших гостей среди т го- стей, уже сидящих за круглым столом? Очевидно, что между т сидящими за круглым столом гостями имеется т промежутков, в которые можно рассаживать вновь прибывших. Таким образом, это можно сделать tzz \ х-./ (т + п — 1)! , V (т, п) = С(т + п — 1, п) = способами. n!(m- 1)! 5.2. Подстановки В этом разделе рассматриваются подстановки и перестановки, которые на са- мом деле являются равнообъемными понятиями. Для вычисления количества
5.2. Подстановки 139 перестановок в подразделе 5.1.4 установлена очень простая формула: Р(п) = п!. Применяя эту формулу при решении практических задач, не следует забывать, что факториал — это очень быстро растущая функция, в частности, факториал растет быстрее экспоненты. Действительно, используя известную из математи- ческого анализа формулу Стирлинга п! « у/2ттппе~п или, более точно у/2ттппе~п < п! < у/2ттппе~п+1 / (12п) нетрудно показать, что 1ПП “~ п->+оо 2П - +оо. 5.2.1. Группа подстановок Взаимнооднозначная функция f: X —> X называется подстановкой на X. ЗАМЕЧАНИЕ ------------------------------------------- Если множество X конечно (|Х| = п), то, не ограничивая общности, можно считать, что X = 1..п. В этом случае подстановку /: l..n -+ 1..п удобно задавать таблицей из двух строк. В первой строке — значения аргументов, во второй — соответствующие значения функции. Пример 3 4 5 2 3 5 1 2 3 4 5 1 4 3 1 2 5 2 9 4 1 Произведением подстановок f и g называется их суперпозиция fog. Пример , _ 1 2 3 4 5 19 5 1 4 3 2 Тождественная подстановка это подстановка е, такая что е(х) = х Пример 1 2 3 4 5 1 2 3 4 5 Обратная подстановка — это обратная функция, которая всегда существует, по- скольку подстановка является биекцией.
140 Глава 5. Комбинаторика ЗАМЕЧАНИЕ--------------------------------------------------------- Таблицу обратной подстановки можно получить, если просто поменять местами строки таблицы исходной подстановки. Пример 1 2 3 4 5 3 4 2 1 5 3 4 2 1 5 1 2 3 4 5 Г1 1 2 3 4 5 4 3 12 5 Таким образом, множество подстановок образует группу относительно операции суперпозиции. Эта группа называется симметрической степени п. 5.2.2. Графическое представление подстановок Подстановки удобно представлять в графической форме, проводя стрелки от ка- ждого элемента х к элементу f(x). Пример Графическое представление подстановки 2 3 4 5 3 14 5 представлено на рис. 5.1. Рис. 5.1. Графическое представление подстановки 5.2.3. Циклы Цикл — это последовательность элементов х0,..., хь, такая что О 'Si 2 < fc, xq, i = k. Цикл длины 2 называется транспозицией.
5.2. Подстановки 141 ЗАМЕЧАНИЕ................................................... - Из графического представления подстановки наглядно видно происхождение термина «цикл». 5.2.4. Подстановки и перестановки В таблице подстановки нижняя строка (значения функции) является перестанов- кой элементов верхней строки (значения аргумента). Если принять соглашение, что элементы верхней строки (аргументы) всегда располагаются в определенном порядке (например, по возрастанию), то верхнюю строку можно не указывать — подстановка определяется одной нижней строкой. Таким образом, подстановки взаимно однозначно соответствуют перестановкам. Перестановку (и соответствующую ей подстановку) элементов 1,...,п будем обозначать (аг,... ,ап), где все at — различные числа из диапазона 1..п. 5.2.5. Инверсии Если в перестановке f = (аг,..., ап) для элементов а, и имеет место неравен- ство ai > aj при i < j, то пара называется инверсией. Обозначим /(/) — число инверсий в перестановке /. ТЕОРЕМА Произвольную подстановку f можно представить в виде суперпози- ции I(/) транспозиций соседних элементов. Доказательство Пусть f — (ai,..., 1,..., ап). Переставим 1 на первое место, меняя ее местами с соседними слева Элементами. Обозначим последовательность этих транспозиций через ti. При этом все инверсии (и только они), в которых участвовала 1, пропа- дут. Затем переставим 2 на второе место и т. д. Таким образом, f о ti о • • • о tn — е и по свойству группы f = t~l о • • • о t^1, причем |ti| + |i21 Н-F |tn| = /(/)• О СЛЕДСТВИЕ Всякая сортировка может быть выполнена перестановкой сосед- них элементов. ОТСТУПЛЕНИЕ-------------------------------------------------------- Доказанная теорема утверждает, что произвольную перестановку можно представить в виде композиции определенного числа транспозиций, но не утверждает, что такое пред- ставление является эффективным. Метод сортировки, основанный на предшествующей теореме, известен как «метод пузырька». Заметим, что при перемещении Элемента на свое место транспозициями соседних элементов все элементы остаются на своих местах, кроме перемещаемого элемента и того элемента, который стоит па целевом месте, а эти элементы меняются местами. Таким образом, метод пузырька может быть выражен в форме алго- ритма 5.1. Этот алгоритм прост, но является далеко не самым эффективным алгоритмом сортировки.
142 Глава 5. Комбинаторика Алгоритм 5.1. Сортировка методом пузырька Вход: массив А : array [l..n] of В, где значения элементов массива расположены в про- извольном порядке и для значений типа В задано отношение <. Выход: массив А : array [l..n] of В, в котором значения расположены в порядке возра- стания. for г from 1 to п — 1 do т: — г{ индекс кандидата в минимальные элементы } for j from г + 1 to п do if A[j] < A[m] then m :=j { новый кандидат в минимальные } end if end for A[i] о A[m] { ставим минимальный элемент на место } end for 5.2.6. Генерация перестановок На множестве перестановок естественным образом можно определить упорядо- ченность на основе упорядоченности элементов. А именно, говорят, что пере- становка (ai,...,ап) лексикографически предшествует перестановке (i>i,...,Ъп), если 3k < п ak < bk&4i < к ai = bi (см. также упражнение 1.9.3). Аналогич- но, говорят, что перестановка {а1у.ап) антилексикографически предшествует перестановке (&i,... ,bn), если Зк < п ак > Ьк & Vi > к ai = Ьг. Следующий алгоритм генерирует все перестановки элементов 1,...,пв антилек- сикографическом порядке. Массив Р : array [l.,n] of l..n является глобальным и предназначен для хранения перестановок. Алгоритм 5.2. Генерация перестановок в антилексикографическом порядке Вход: п — количество элементов Выход: последовательность перестановок элементов 1,..., п в антилексикографическом порядке. for г from 1 to п do P[i]: = i { инициализация } end for Antilex(n) { вызов рекурсивной процедуры Antilex } Основная работа по генерации перестановок выполняется рекурсивной процеду- рой Antilex. Вход: т — параметр процедуры — количество первых элементов массива Р, для которых генерируются перестановки. Выход: последовательность перестановок 1,... ,т в антилексикографическом порядке. if т = 1 then yield Р { очередная перестановка } else for i from 1 to m do Antilex(m — 1) { рекурсивный вызов } if i < m then
5.2. Подстановки 143 Р[г] о P[m] { следующий элемент } Reverse(m — 1) { изменение порядка элементов } end if end for end if Вспомогательная процедура Reverse переставляет элементы заданного отрезка пассива Р в обратном порядке. Вход: к — номер элемента, задающий отрезок массива Р, подлежащий перестановке в обратном порядке. Выход: первые к элементов массива Р переставлены в обратном порядке j: = 1 { нижняя граница обращаемого диапазона } while j < к do P[j] о P[fc] J • = j + 1 k: = k — 1 end while Обоснование Заметим следующее. Искомую последовательность перестановок п элементов можно получить из последовательности перестановок п — 1 элемента следую- щим образом. Нужно выписать п блоков по (п — 1)! перестановок в каждом, соответствующих последовательности перестановок п - 1 элемента в антилек- сикографическом порядке. Затем ко всем перестановкам в первом блоке нужно приписать справа п, во втором — п - 1 и т. д. в убывающем порядке. Затем в каждом из блоков (кроме первого), к перестановкам которого справа приписан элемент г, нужно в перестановках блока заменить все вхождения элемента i на элемент п. В полученной последовательности все перестановки различны, и их п(п - 1)! — п\, то есть перечислены все перестановки. При этом антилексико- графический порядок соблюден: для последовательностей внутри одного блока, потому что этот порядок был соблюден в исходной последовательности, а для последовательностей на границах двух блоков, потому что происходит уменьше- ние самого правого элемента. Обратимся к процедуре Antilex — легко видеть, что в ней реализовано указанное построение. В основном цикле сначала'строит- ся очередной блок — последовательность перестановок первых т — 1 элементов массива Р (при этом элементы Р[т],..., Р[п] остаются неизменными). Затем эле- мент Р[т] меняется местами с очередным элементом Р[г]. Вызов вспомогатель- ной процедуры Reverse необходим, поскольку последняя перестановка в блоке является обращением первой, а для генерации следующего блока на очередном шаге цикла нужно восстановить исходный порядок. □ Пример Последовательность перестановок в антилексикографическом порядке для п = 3: (1,2,3), (2,1,3), (1,3,2), (3,1,2), (2,3,1), (3,2,1).
144 Глава 5. Комбинаторика 5.3. Биномиальные коэффициенты Число сочетаний C(m,n) — это число различных n-элементных подмножеств т- элементного множества (см. подраздел 5.1.5). Числа С(т, п) встречаются в фор- мулах решения многих комбинаторных задач. Действительно, рассмотрим следу- ющую типовую схему рассуждений при решении комбинаторной задачи. Пусть нужно определить число подмножеств m-элементного множества, удовлетворя- ющих некоторому условию. Разобьем задачу на подзадачи: рассмотрим отдельно 1-элементные подмножества, 2-элементые и т. д., а затем сложим полученные ре- зультаты. К счастью, числа С(т, п) обладают целым рядом свойств, рассматри- ваемых в этом разделе, которые оказываются очень полезными при выкладках. 5.3.1. Элементарные тождества Основная формула для числа сочетаний С(т, п) = —г---- п\(т — п)! позволяет получить следующие простые тождества. ТЕОРЕМА 1. С(т, ri) = С(т, т — п), 2. C(m, ri) = С(т — 1, n) + С(т — 1, п — 1), 3. С(п, i)C(i, т) = С(п, т)С(п — m,i — т). Доказательство 1. 2. С(т, т-п) = ---------—-----—-------— (т — п)! (т — (тп — п))! т! (m — ri)lnl = С(т, п). С(т - 1, п) + С(т - 1, п - 1) = = ~ г)! +______ (т -1)! п! (т — п — 1)! (п — 1)! {т — 1 — {п — 1))! ~ _ (т— 1)! (т — 1)! п(п — 1)! (т — п — 1)! (п — 1)!\т — п)(т п — 1)! — (т ~ nXTO ~ I)1- + п(т ~ !)• _ п(п — 1)! (т — п)(т — п — 1)! (т-п + п)(т-1)! т! _ =--------п—~ :--- = С(т,п). n!(m —n)!r nl(m — n)l ( 'ХСС Ч — п! _______ n'’_____= ’ г,т) т!(г — т)! ml(i — m)l(n — i)l _ ni(n — m)i _ ml(i — m)!(n — i)!(n — m)!
5.3. Биномиальные коэффициенты 145 _ п! (п — т)! _ m!(n — т)! (г — m)l(n — г)! — С(п, т)С(п — т, i — т). □ 5.3.2. Бином Ньютона Числа сочетаний С(т, п) называются также биномиальными коэффициентами. Смысл этого названия устанавливается следующей теоремой, известной также как формула бинома Ньютона. ТЕОРЕМА (х + у)т ^С(т,п)хпут-П п—0 Доказательство По индукции. База, т = 1 (х + у)1 — х + у = lxry° + la:0?/1 = С(1,0)!1?/0 + <7(1,1)!0?/1 = 52 п)хпу п—0 Индукционный переход: (а: + у)т = (х + 2/)(х + у)™-1 = (х + у) £ С{т - 1, п=0 = 52 хС(т - 1,п)хпз/’п~п~1 4- 52 уС(т - \,п)хпут~п~ п=0 П=О т-1 m-i = 52 С(т - l.n)^1?/"1-"-1 + 52 <7(т - 1,п)хпут~п п—0 п—0 = 52 (С(то - 1,п - 1) + с(т - 1, n)) хпут~п + С{т - 1, т 1)хту° п=0 = 52 С(т, n)xnym~n + С{т, т)хтут~т = С(т, п)хпут-п. □ п=0 п=0 СЛЕДСТВИЕ £ С(т, п) = 2т п=0 Доказательство 2т = (1 + 1)т = Ё С(т,п)1«1т-П = V С(т, п). □ п=*
146 Глава 5. Комбинаторика СЛЕДСТВИЕ £ (—1)пС(т,п) = 0. п=0 Доказательство О = (-1 + l)m = X C(m,n)(-l)"lm-n = X (~1)пС(т,п). □ п=0 п=0 5.3.3. Свойства биномиальных коэффициентов Биномиальные коэффициенты обладают целым рядом замечательных свойств. ТЕОРЕМА 1. X пС(т, п) = т2т~1, п=0 к 2. С(т + п,к) = X С(т, i)C(n, к — г). г=0 Доказательство 1. Рассмотрим следующую последовательность из чисел 1,...,т. Сначала все подмножества длины 0, потом все подмножества длины 1 и т. д. Имеется С(т, п) подмножеств мощности п, и каждое из них имеет длину п, таким образом, всего в этой последовательности X пС(т,п) чисел. С другой сто- п=0 роны, каждое число х входит в эту последовательность г^1’= г"1-1 раз, а всего чисел т. 2. С(п + т, к) — это число способов выбрать к предметов из т + п предметов. Предметы можно выбирать в два приема: сначала выбрать i предметов из пер- вых т предметов, а затем выбрать недостающие k—i предметов из оставшихся п предметов. Отсюда общее число способов выбрать к предметов составляет к X C(jn,i)C(n,k - г). □ i=0 ЗАМЕЧАНИЕ---------------------------------------—------------ Последнее свойство известно как тождество Коши. 5.3.4. Треугольник Паскаля Из второй формулы теоремы 5.3.1 вытекает эффективный Способ реккурентного вычисления значений биномиальных коэффициентов, который можно предста- вить в графической форме, известной как треугольник Паскаля1. 1Блез Паскаль (1623-1662)
152 Глава 5. Комбинаторика ► 999 : (5 * 7) = 28 делятся на 5 и на 7, > 999 : (3 * 5 * 7) = 9 делятся на 3, на 5 и на 7. Имеем: 999 - (333 + 199 + 142 - 66 - 47 - 28 + 9) = 457. 5.5.2. Принцип включения и исключения Следующая формула, известная как принцип включения и исключения, позволя- ет вычислить мощность объединения множеств, если известны их мощности и мощности всех пересечений. ТЕОРЕМА Ua =J2|A|- 52 + 52 lAHXjnAfcl-... + (-1)п-1|А1Па..пАп|. Доказательство Индукция по п. Для п = 2,3 теорема проверена в предыдущем подразделе. Пусть |jAi =521Ail_ 12 |AjПAj| + • • • + (—1)” 2|An---nAn_i|. г=1 i=l /п—1 \ п—1 Заметим, что I U I CAn = U (Aid-А), и по индукционному предположению \г=1 / г—1 |{j(Ai П An)| = 52|AinAn|- 52 |AiDAJ DAn| + ... 1=1 1=1 l^!<J<n-l + (-i)n-2|Ai n • • n All П Al- Тогда IjA = (|jAi)UAn = (jAi + |An| — (J A)nA i=l n—1 52lA- 52 |Ai O Aj| + • • • + (—1)”-2|Ai n • • • n A-11 + + Ип| - 52 lAi n Anl “ 12 lAiCAj HAn| + ... + (-l)n~2|Ai П • • • П A-! n Anl
148 Глава 5. Комбинаторика Обоснование Заметим, что в искомой последовательности n-элементных подмножеств (каждое из которых является возрастающей последовательностью п чисел из диапазо- на l..m) вслед за последовательностью (ai,...,an) следует последовательность (bi,... ,bn) = (ai,... ,ap_i,Op-|-l,ap-|-2,... ,ар+п—р+1), гдер — максимальный индекс, для которого bn — ар + п — р + 1 < т. Другими словами, следующая последовательность получается из предыдущей заменой некоторого количества элементов в хвосте последовательности на идущие подряд целые числа, но так, чтобы последний элемент не превосходил т, а первый изменяемый элемент был на 1 больше, чем соответствующий элемент в предыдущей последовательности. Таким образом, индекс р, начиная с которого следует изменить «хвост последова- тельности», определяется по значению элемента Л[п]. Если A[n] < т, то следует изменять только А[п], и при этом р: — п. Если же уже А[п] = т, то нужно умень- шать индекс р: = р — 1, увеличивая длину изменяемого хвоста. □ Пример Последовательность n-элементных подмножеств m-элементного множества в лексикографическом порядке для п = 3 и т = 4: (1,2,3), (1,2,4), (1,3, 4), (2,3,4). 5.4. Разбиения Разбиения не были рассмотрены среди типовых комбинаторных конфигураций в разделе 5.1, потому что получить для них явную формулу не так просто, как для остальных. В этом разделе исследуются основные свойства разбиений, а оконча- тельные формулы приведены в подразделе 5.6.3. 5.4.1. Определения Пусть Ъ = {В1; , Вп} есть разбиение множества X из т элементов на п под- множеств: Bi С X, (J Bi = X, Bt/0, BiC\Bj = 0 при i j. i=l Подмножества Bi называются блоками разбиения. Между разбиениями и отношениями эквивалентности существует взаимноодно- значное соответствие (см. подраздел 1.7.2). Если и В2 — два разбиения X, то говорят, что разбиение Ег есть измельчение разбиения В2, если каждый блок В2 есть объединение блоков Ei. Измельчение является частичным порядком на множестве разбиений.
5.4. Разбиения 149 5.4.2. Числа Стирлинга второго рода Число разбиений т-элемецтного множества на п блоков называется числом Стирлинга1 второго рода vi обозначается 5(m,n). По определению положим S(m, 0): = 0 при m > О, S(m, m): = 1, S(0,0): = l, Sftri, n): = 0 при n > m. ТЕОРЕМА 5(m, n) 5(m l,n - 1) + nS(m — l,n) Доказательство Пусть Ъ — множество всех разбиений множества {1, т} на п блоков. Поло- жим 31: = {Х &Ъ\ЗВеХ В = {т}}, Ъ2-. = {Х еЪ\-^ЗВ еХ В = {т}}, то есть в входят разбиения, в которых элемент т образует отдельный блок, а в 32 все остальные разбиения. Заметим, что 32 = {X е Ъ I т е X => |Х| > 1}. Тогда Ъ — 3iU32, ®1Г)Ъ2 = 0- Имеем |3i| = S(m — l,n — 1), = п S(m — l,ri), так как все разбиения Ъ2 получаются следующим образом: берем все разбиения множества {1,..., т-1} на п блоков (их 5(m-1, п)) и в каждый блок по очереди помещаем элемент т. Следовательно, S(m, ri)--±= |3| = (3i| + |32'| — S{pn — 1,п — 1) + nS(m - 1,п). □ ТЕОРЕМА 5(т, n) ~ С(т - п - 1). г—п—1 Доказательство Пусть 3 — множество всех разбиений множества {!,...,т} на п блоков. Рас- смотрим семейство В: = {В С | т G В]. Тогда ® = IJ ®в, вев где Зд : = {X | X е 3 & В е X}, причем Зв- ПВв» = 0, если В' / В >> Пусть В е В и Ь: = |В]. Тогда |Вв| = S(m - Ь-,-п - 1). Заметим, что I {в G B I |В| = b} I = С(т - ltb - 1). 1 Джеймс Стирлинг (1699-1770)
150 Глава 5. Комбинаторика Имеем т— (n—1) S(m,n) = |®|= £ JJ ЪВ ь=1 вев&|в|=ь где i: = т — Ь. т—(n—1) = С(т - 1,Ь - 1)5(тп — Ъ, п — 1) = 6=1 п—1 = (7(771 — 1,771-2 — 1)5(1,11 — 1) = £=m—1 = У2 (7(тт1 - 1,г)5(г, 71 - 1), г=п—1 □ 5.4.3. Числа Стирлинга первого рода Число сюръективных функций, то есть число размещений тп предметов по п ящикам, таких что все ящики заняты, называется числом Стирлинга первого рода и обозначается s(m, п). Каждое разбиение множества {1,..., тп} соответствует ядру сюръективной функ- ции и обратно (см. подраздел 1.7.4). Таким образом, число различных ядер сюръ- ективных функций — это число Стирлинга второго рода 5(тп, ti). Всего сюръек- тивных функций s(m, ti) = n! S(tti, ti), так как число сюръективных функций с заданным ядром равно числу перестановок множества значений функции. 5.4.4. Число Белла Число всех разбиений тп-элементного множества называется числом Белла и обо- значается В(Т71). В(тп): = 5(тп, 71), В(0): = 1. п=0 ТЕОРЕМА В(тп + 1) = £ С(т, г=0 Доказательство Пусть Ъ — множество всех разбиений множества 1..771+1. Рассмотрим множество подмножеств множества 1..тп + 1, содержащих элемент тп + 1: В: = (В С 2<1’ ’т+1} |тп+1 ев).
5.5. Принцип включения и исключения 151 Тогда Ъ = U Ъв, где Ъв: = {X € 3 | В € X}. Пусть В ё В и b = |В| Тогда вев _ |®в| = В(т + 1-6). Заметим, что | {В € В |В[ = 6} ] = C(m,b 1). Следова- тельно, т+1 В(т + 1) = |Ъ| = ^2 С(т, b — Г)В(т — b + 1) = 6=1 0 пг = ^С<т,т - г)В(г) = 52С(т,г)В(г), i—Q где i = т - b +1 □ 5.5. Принцип включения и исключения Приведенные в предыдущих четырех разделах формулы и алгоритмы дают спо- собы вычисления комбинаторных чисел для некоторых распространенных ком- бинаторных конфигураций. Практические задачи не всегда прямо сводятся к известным комбинаторным конфигурациям. В этом случае используются раз- личные методы сведения одних комбинаторных конфигураций к другим. В этом и двух следующих разделах рассматриваются три наиболее часто используемых метода. Мы начинаем с самого простого и прямолинейного, но имеющего ограниченную сферу применения принципа включения и исключения. 5.5.1. Объединение конфигураций Часто комбинаторная конфигурация является объединением других, число ком- бинаций в которых вычислить проще. В таком случае требуется уметь вычислять число комбинаций в объединении. В простых случаях формулы для вычисления очевидны; |AUB| = |А| + |В| - |АПВ|, |АU В U С| = |А| + |В| + |С| - |А П В| - |В П С\ - |А Г) С| + |А Г) В Г) С|. Пример Сколько существует натуральных чисел, меньших 1000, которые не делятся ни на 3, ни на 5, ни на 7? Всего чисел, меньших тысячи, 999. Из них: ► 999 : 3 = 333 делятся на 3, ► 999 : 5 = 199 делятся на 5, ► 999 : 7 = 142 делятся на 7, ► 999 : (3 * 5) = 66 делятся на 3 и на 5, ► 999 : (3 * 7) = 47 делятся на 3 и на 7,
5.3.- Биномиальные коэффициенты 147 1 1 1 1 2 1 13 3 1 1 4 6 4 1 В этом равнобедренном треугольнике каждое число (кроме единиц на боко- вых сторонах) является суммой двух чисел, стоящих над ним. Число сочетаний С(т, п) находится в (т + 1)-м ряду на (п + 1)-м месте. 5.3.5. Генерация подмножеств Элементы множества {1,...,тп} упорядочены. Поэтому каждое п-элементное подмножество также можно рассматривать как упорядоченную последователь- ность. На множестве таких последовательностей естественным образом опреде- ляется лексикографический порядок (см. упражнение 1.8). Следующий простой алгоритм генерирует все n-элементные подмножества m-элементного множества в лексикографическом порядке. Алгоритм 5.3. Генерация n-элементных подмножеств m-элементного множества Вход: п — мощность подмножества, т — мощность множества, т п > 0. Выход: последовательность всех n-элементных подмножеств m-элементного множества в лексикографическом порядке, for i from 1 to m do А [г]: =i { инициализация исходного множества } end for if m = n then yield A[l..n] { единственное подмножество } exit end if p: = n { p — номер первого изменяемого элемента } while р 1 do yield A[l..n] { очередное подмножество в первых п элементах массива А } if А[п] = т then р: =р — 1 { нельзя увеличить последний элемент } else р: = п { можно увеличить последний элемент } end if if р 1 then for г from п downto р do A[i]: = A[p] + i — p + 1 { увеличение элементов } end for end if end while
5.6. Формулы обращения 153 1>| + |Ап| .1=1 П —1 \ ^2 + )+••• 1^2<jXn-1 i=l / - (-l)n-2|Ai П • • П А„_1 П Ап| = = £1^1- 12 1ЛпА7| + --- + (-1)п-1|А1П---ПА„|. 1=1 1^2<j^n □ 5.5.3. Число булевых функций, существенно зависящих от всех своих переменных Рассмотрим применение принципа включения и исключения на примере следую- щей задачи. Пусть рп = |РП| — 22" — число всех булевых функций п переменных, а рп — число булевых функций, существенно зависящих от всех п переменных (см. подраздел 3.1.2). Пусть РД — множество булевых функций, у которых пе- ременная Xi фиктивная (кроме Xi могут быть и другие фиктивные переменные). Имеем: pn — |Pn \ (Р^ U • • • U Р”)| = п Рп\ U Р‘ П=1 С другой стороны, |Р„| = 22” 1, более того, |Р^ П- • -ИР^ | = 22" к. Следовательно, Рп = 22”- £|Р‘|- 52 1^ПР>| + --- + (-1Г-1|Р>...ПРпЧ \i=l = 22" - [с(п, 1)22" 1 - С(п,2)22"-2 + • • + (-1)п~1С(п,п)2) = п = 52(-1)Ш022"_<. 2=0 5.6. Формулы обращения Очень полезную, но специфическую группу приемов образуют различные спосо- бы преобразования уже полученных комбинаторных выражений. В этом разделе рассматривается один частный, но важный случай. 5.6.1. Теорема обращения Пусть an,k и bn,k — некоторые (комбинаторные) числа, зависящие от параметров п и к, причем 0 < к п. Если известно выражение чисел ап^ через числа bn,k, то в некоторых случаях можно найти и выражение чисел &njfc через числа ап,к, то есть решить комбинаторное уравнение.
154 Глава 5. Комбинаторика ТЕОРЕМА Пусть п УпУ k П 0>n,k ~ 5 ^n,k,i.bn,i i=0 и пусть т'— к, т^к. Тогда п. V к Т1 Ьп,к — 5 i=0 5.6.2. Формулы обращения для биномиальных коэффициентов Применение теоремы обращения предполагает отыскание для заданных чисел An,fc,i (коэффициентов комбинаторного уравнения) соответствующих чисел yn,k,i> удовлетворяющих условию теоремы обращения. Особенно часто числами Xn,k,i являются биномиальные коэффициенты. ЛЕММА У(-1/-”гС(п,г)С(г,тп)= ’ 0, т<п. Доказательство 52(~l)l~mC(n,T)C(i, т) = 52(~1)г~т(^(п, пг)С(п — m,i — т) = г=0 г=0 = 52(~1)г-тС'(п, т)С(п — m,i — т) = г=тп = С(п,т) 52(-1)’-™^ — т,г — т). i=m Но при т < п имеем: У~^(—1)г”пС(п - m,i — т) = 52 (~1)-’С'(п — m,j) = О, г=т О
5.6. Формулы обращения 155 где j: = i - т. С другой стороны, при т = п имеем: С(п, т) ^(-1у~тС(п — т,г — т) = С(п, тг)(-1)п-пС(0,0) = 1. □ i=m ТЕОРЕМА Если ап,к = £ C(k,i)bntk, то bntk — 52(-l)fe-iC(fc,t)an)i. i=0 i=0 Доказательство Здесь Xn,k,i = C(k,i) и iin,k,i = (—l)fc_lC(fc, г). При к п, т п имеем: г=0 г=0 к = 52(-l)fc-i+m~mC(fc,OC'(i,m) = г=0 к г=0 {1, к— т, |_j 0, к / т. ТЕОРЕМА Если ап<к = £ C(i,k)bn:i, то Ьп>к — i=k i=k Доказательство Здесь Xn,k,i — С(i, fc) и /in,fc,i = (-l)i~feC'(i, к). При к п, т п имеем: = ^-iy~kC(i,k)C(m,i) = £=0 г=0 = ^(-l)i-fcC(m, г)С(г, к) = г=0 _ fl) к — п, |—I к У=- п. 5.6.3. Формулы для чисел Стирлинга В качестве примера использования формул обращения рассмотрим получение явных формул для чисел Стирлинга первого и второго рода. Рассмотрим мно- жество функций /: А -> В, где |А| = п и |В| = к. Число всех таких функций равно кп. С другой стороны, число функций /, таких что |/(А)| = г, равно s(i, п),
156 Глава 5. Комбинаторика поскольку s(i,n)— это число сюръективных функций f: 1..п 1.Л. Но область значений функции (при заданном г) можно выбрать С(к, г) способами. Поэтому к кп = У^С(А:,г)з(г,п). г=0 Обозначив an<k : = кп и bn<i: = s(i, п), имеем по первой теореме предыдущего под- раздела, s(fc,n) = ^(-l)fc-iC'(i,fc)r. г=0 Учитывая связь чисел Стирлинга первого и второго рода, имеем: 1 п i=0 5.7. Производящие функции Для решения комбинаторных задач в некоторых случаях можно использовать ме- тоды математического анализа. Разнообразие применяемых здесь приемов весь- ма велико, и не может быть в полном объеме рассмотрено в рамках этой книги. В данном разделе рассматривается только основная идея метода производящих функций, применение которой иллюстрируется простым примером. Более де- тальное рассмотрение можно найти в литературе, например в [20]. 5.7.1. Основная идея Пусть есть последовательность комбинаторных чисел а, и последовательность функций Pi(x). Рассмотрим формальный ряд: Э^гг) : = У~^агУг(а:). i Э^гг) называется производящей функцией (для заданной последовательности ком- бинаторных чисел щ относительно заданной последовательности функций y>i{x)). Обычно используют У>г(я) : = Х* ИЛИ Рг{х) : = xi/i\. Пример Из формулы бинома Ньютона при у: = 1 имеем: (1 + х)п = С(п, г)хг. 1=0 Таким образом, (1 -ь х)п является производящей функцией для биномиальных коэффициентов.
Упражнения 157 5.7.2. Метод неопределенных коэффициентов Из математического анализа известно, что если 3"(®) ' = 52 а^(ж) и у(ж): = 52 то Vi a,i = bi (для рассматриваемых здесь систем функций <^). В качестве примера применения производящих функций рассмотрим доказатель- ство следующего тождества. ТЕОРЕМА <7(2тг, тг) = 52 кУ к=0 Доказательство Имеем: (1 + ж)2п = (1 + ж)п(1 + ж)п. Следовательно, ^2(7(271,2)2:’ = ^2 <7(71,2)2:’ • ^2 <7(21,2)2:’. г—0 г—О г=0 Приравняем коэффициент при хп: С(2п, тг) = 52 С(п, ^)<7(п, п — к) = 52 С(п>к>)2- □ fc=O fc=O Комментарии Сведения из области комбинаторного анализа в том или ином объеме приводят- ся в любом учебнике по дискретной математике (см., например, [25, 18]). Явные формулы для комбинаторных чисел часто используются при оценке размера про- странства поиска в переборных задачах программирования. Очень богатый набор полезных формул-для комбинаторных чисел можно найти в книгах [19] и [20]. Все алгоритмы этой главы заимствованы (в модифицированном виде) из кни- ги [14]. Упражнения 5.1. Доказать, что А(т, тг) = А(тп - 1, тг) + пА(т - 1, тг — 1). 5.2. Доказать, что множество перестановок с четным числом инверсий образует группу. 5.3. Доказать, что тС(гп — 1, тг — 1) = пС(т, тг). 5.4. Доказать, что число последовательностей длины тг, составленных из элемен- тов множества 1,.ттг и содержащих каждый элемент множества 1..тп по край- ней мере один раз, равно m\S(n,m).
158 Глава 5. Комбинаторика 5.5. Рассмотрим множество функций /: X —> X, где |Х| = п. Элемент х е X называется неподвижной точкой функции /, если /(ж) = ж. Пусть Нп — множество функций, не имеющих неподвижных точек. Определить, чему равно |НП|. 5.6. Пусть р^ — число булевых функций, существенно зависящих от всех своих переменных. Очевидно, что 22" = "<Рс(п i-0 Получить явную формулу для р^, используя формулы обращения. 5.7. Числа Фибоначчи F(n) определяются следующим образом: F(0): = 1, F(l)-: = 1, F(n + 2): = F(n + 1) + F(n). Найти выражение для F(n) через п (указание: рассмотреть производящую функцию 1/(1 — ж — ж2)).
ГЛАВА 6 Кодирование Вопросы кодирования издавна играли заметную роль в математике. Пример 1 . Десятичная позиционная система счисления — это способ кодирования нату- ральных чисел. Римские цифры — другой способ кодирования натуральных чисел, причем гораздо более наглядный и естественный: палец — I, пятерня — V, две пятерни — X. Однако при этом способе кодирования труднее выполнять арифметические операции над большими числами, поэтому он был вытеснен позиционной десятичной системой. 2 . Декартовы координаты — способ кодирования геометрических объектов чи- слами. Ранее средства кодирования играли вспомогательную роль и не рассматривались как отдельный предмет математического изучения, но с появлением компьютеров ситуация радикально изменилась. Кодирование буквально пронизывает инфор- мационные технологии и является центральным вопросом при решении самых разных (практически всех) задач программирования: ► представление данных произвольной природы (например чисел, текста, гра- фики) в памяти компьютера; ► защита информации от несанкционированного доступа; ► обеспечение помехоустойчивости при передаче данных по каналам связи; ► сжатие информации в базах данных. ЗАМЕЧАНИЕ------------------------------------------------------—— Само составление текста программы часто и совершенно справедливо называют кодиро- ванием. Не ограничивая общности, задачу кодирования можно сформулировать следу- ющим образом. Пусть заданы алфавиты А = {ai,...,an}, В = {Ьг,... ,Ьт} и
160 Глава 6. Кодирование функция F-. S —> В*, где S — некоторое множество слов в алфавите A, S С А*. Тогда функция F называется кодированием, элементы множества S — сообщения- ми, а элементы /3 — F{a), а е S, [3 е В* — кодами (соответствующих сообщений). Обратная функция F-1 (если она существует!) называется декодированием. Если |73| = тп, то F называется m-ичным кодированием. Наиболее распространен- ный случай В = {0,1} — двоичное кодирование. Именно этот случай рассматри- вается в последующих разделах; слово «двоичное» опускается. Типичная задача теории кодирования формулируется следующим образом: при заданных алфавитах А, В и множестве сообщений S найти такое кодирование F, которое обладает определенными свойствами (то есть удовлетворяет заданным ограничениям) и оптимально в некотором смысле. Критерий оптимальности, как правило, связан с минимизацией длин кодов. Свойства, которые требуются от кодирования, бывают самой разнообразной природы: ► существование декодирования — это очень естественное свойство, однако даже оно требуется не всегда. Например, трансляция программы на языке высокого уровня в машинные команды — это кодирование, для которого не требуется однозначного декодирования; ► помехоустойчивость, или исправление ошибок: функция декодирования F-1 обладает таким свойством, что F-1(/3) = F~1(/3'), если /3' в определенном смысле близко к /3 (см. раздел 6.3); ► заданная сложность (или простота) кодирования и декодирования. Например, в криптографии изучаются такие способы кодирования, при которых имеется просто вычисляемая функция F, но определение функции F-1 требует очень сложных вычислений (см. подраздел 6.5.5). Большое значение для задач кодирования имеет природа множества сообщений S. При одних и тех же алфавитах Л, В и требуемых свойствах кодирования F оптимальные решения могут кардинально отличаться для разных S. Для описа- ния множества S (как правило, очень большого или бесконечного) применяются различные методы: ► теоретико-множественное описание, например S = {а | а е |а| = п}; ► вероятностное описание, например S = А*, и заданы вероятности pi появления букв в сообщении, J2"=1 Pt = 1; ► логико-комбинаторное описание, например, S задано порождающей формаль- ной грамматикой. В этой главе рассматривается несколько наиболее важных задач теории кодиро- вания и демонстрируется применение большей части упомянутых здесь приемов.
6.1. Алфавитное кодирование 161 6.1. Алфавитное кодирование Кодирование F может сопоставлять код всему сообщению из множества S как единому целому или же строить код сообщения из кодов его частей. Элемен- тарной частью сообщения является одна буква алфавита А. Этот простейший случай рассматривается в этом и следующих двух разделах. 6.1.1. Префикс и постфикс слова Пусть задано конечное множество А = {а1;..., ап}, которое называется алфави- том. Элементы алфавита называются буквами. Последовательность букв называ- ется словом (в данном алфавите). Множество слов в алфавите А обозначается А*. Если слово о = ai... at G А*, то количество букв в слове называется длиной сло- ва: |о| = |ai... а*| = к. Пустое слово обозначается Л: Л G А*, |Л| = О, Л £ А. Если а = 0102 > то называется началом, или префиксом, слова а, а а2 — оконча- нием, или постфиксом, слова а. Если при этом oj / Л (соответственно, а2 / Л), то (соответственно, о2) называется собственным началом (соотвественно, соб- ственным окончанием) слова а. 6.1.2. Таблица кодов Алфавитное (или побуквенное) кодирование задается схемой (или таблицей ко- дов) а: & • —(^1 /31,..., ап /Зп), a>i € A, fit G 23 . Множество кодов букв V: ={/?f} называется множеством элементарных кодов. Алфавитное кодирование пригодно для любого множества сообщений S: F-.A*—>B*, ail.. .aik = a G A*, F(a) := (3^ ... (3ik. Пример Рассмотрим алфавиты А: ={0,1,2,3,4,5,6,7,8,9}, В: ={0,1} и схему <5: =(0 —> 0,1 —> 1,2 —> 10,3 -э 11,4 100,5 -э 101,6 -+ 110, 7 -> 111,8 —> 1000,9 -> 1001). Эта схема однозначна, но кодирование не является взаимно однозначным: Fs(333) = 111111 = F«(77), а значит, невозможно декодирование. С другой стороны, схема 5: =(0 -> 0000,1 -> 0001,2 -> 0010,3 -> ООН, 4 -> 0100,5 -> 0101,6 -> ОНО, 7 -> 0111,8 -> 1000,9 1001), известная под названием «двоично-десятичное кодирование», допускает одно- значное декодирование.
162 Глава 6. Кодирование 6.1.3. Разделимые схемы Рассмотрим схему алфавитного кодирования <т и различные слова, составленные из элементарных кодов. Схема <т называется разделимой, если = /Зц • • • Pi, =>k = l&Vte l..k it =jt, то есть любое слово, составленное из элементарных кодов, единственным обра- зом разлагается на элементарные коды. Алфавитное кодирование с разделимой схемой допускает декодирование. Если таблица кодов содержит одинаковые элементарные коды, то есть если 3i,j i/j&ft = /3>, где Pi, Pi G V, то схема заведомо не является разделимой. Такие схемы далее не рассматриваются, то есть Vi / j Pi, Pi G V => Pt ± Pj. 6.1.4. Префиксные схемы Схема а называется префиксной, если элементарный код одной буквы не является префиксом элементарного кода другой буквы: (Vi / j Pi,Pi G V) => VP G B* pi * Pip). ТЕОРЕМА Префиксная схема является разделимой. Доказательство От противного. Пусть кодирование со схемой а не является разделимым. Тогда существует такое слово /3 G F^iA*), что Р — Pii • • • Pik ~ Pji • ’ ’ Pjl Vs (s < t -> Pis = P^ k Pit Pit})- Поскольку pit ...pik = Pit.. .Рц, значит, 3/3' (/3it = pjtP' X/ pjt = pitP'), но это противоречит тому, что схема префиксная. □ ЗАМЕЧАНИЕ------------------------------------------------------- Свойство быть префиксной является достаточным, но не является неооходимым для раз- делимости схемы. Пример Разделимая, но не префиксная схема: А = {а, Ь}, В = {0,1}, 6 = {а -> О, b -> 01}.
6.1. Алфавитное кодирование 163 6.1.5. Неравенство Макмиллана Чтобы схема алфавитного кодирования была разделимой, необходимо, чтобы длины элементарных кодов удовлетворяли определенному соотношению, извест- ному как неравенство Макмиллана. ТЕОРЕМА Если схема а = (а< разделима, то Доказательство Обозначим I : = тах Ц. Рассмотрим n-ю степень левой части неравенства г=1 Раскрывая скобки, имеем сумму 52 (2^+"+ч-1, (£1 ,...,£„) где ii,..., in — различные наборы номеров элементарных кодов. Обозначим через v(n, t) количество входящих в эту сумму слагаемых вида 1/2*, где t = Ч- Для некоторых t может быть, что v(n, t) = 0. Приводя подобные, имеем сумму 2^ 2* t=l Каждому слагаемому вида (2,‘1+" +г‘~)-1 можно однозначно сопоставить код (слово в алфавите В) вида ... ftin. Это слово состоит из п элементарных кодов и имеет длину t. Таким образом, i/(n, i) — это число некоторых слов вида (Зг1 ... , таких что IA1 •••/?£„I = L В силу разделимости схемы iz(n,t) 2*, в противном случае заведомо существовали бы два одинаковых слова Д, ... • • • /?j„ > допус- кающих различное разложение. Имеем ^.2* 2-.-2Г-<2-.2г = »'- t=i . t=i п‘ п __ Следовательно, Vn (£ 2”Zi)n И значит, 2“^ vnl, откуда г=1 г=1 V2-'* < lim Vnl = 1. □ / n—>оо 1=1 Неравенство Макмиллана является не только необходимым, но и в некотором смысле достаточным условием разделимости схемы алфавитного кодирования.
164 Глава 6. Кодирование ТЕОРЕМА Если числа . ,1п удовлетворяют неравенству п 1 1=1 то существует разделимая схема алфавитного кодирования а = (а; —> /Зг)”=1 где Уi It = \/3t\. Доказательство Без ограничений общности можно считать, что 12 1п- Разобьем мно- жество pi,... ,1п} на классы эквивалентности по равенству {Li,... ,Lm}, т^п. Пусть тп Xi С Li, p>i . — | j p>i — П, Ai <Z A 2 < • • ‘ < Am. i=l Тогда неравенство Макмиллана можно записать так: m г=1 Из этого неравенства следуют т неравенств для частичных сумм: ^1=>/^2А‘ (1) + (2) — + — + ••• + — < <2А™- 2^! + 2а= + М д22Ат-Аз-дт_12Ат-А (т) Рассмотрим слова длины Ai в алфавите В. Поскольку 2А1, из этих слов можно выбрать pi различных слов /31,... ,/3М1 длины Аь Исключим из дальней- шего рассмотрения все слова из В*, начинающиеся со слов /31,... ,/3М1. Далее рассмотрим множество слов в алфавите В длиной А2 и не начинающихся со слов /?1,... Таких слов будет 2Аа -gi2Aa~A1. Но р2 С 2Аа -gi2Aa-Al, значит, можно выбрать р2 различных слов. Обозначим их /3М1+1,... ,/3М1+М2. Исключим слова, начинающиеся с /3М1+1,... ,/3М1+М2, из дальнейшего рассмотрения. И так далее, используя неравенства для частичных сумм, мы будем на i-м шаге выби- рать рг слов длины Af, /3Ml+M2+...+Mi_J,...,/3M1+M2+...+Mi_l+Mi, причем эти слова не будут начинаться с тех слов, которые были выбраны раньше. В то же время длины этих слов все время растут (так как Аг < А2 < • • • < Хт), поэтому они не могут быть префиксами тех слов, которые выбраны раньше. Итак, в конце имеем набор из п слов /Зь... ,/3М1+...+Мт = 0п, 1/ЗД = 1Ъ...,|/Зп| = 1п, коды А,...,/Зп не являются префиксами друг друга, а значит, схема а = —> Д)"=1 будет префиксной и, по теореме предыдущего подраздела, разделимой. □
6,2. Кодирование с минимальной избыточностью 165 Пример Азбука Морзе — это схема алфавитного кодирования (А- > 01, Z? —» 1000, с -4 1010, D -4 100, £ 0, F -> 0010, G -> 110, н- 4 0000,7 -4 00, J 0111, К 101, L -4 0100, М -+ 11, N -4 10, О- 4 111,Р- 4 ОНО, Q - 4 1101,Я - 4 010, S -+ 000, Т -4 1, U -4 001, V- 4 0001,И^->011,Х -4 1001, У -4 1011, -4 1100), где по историческим и техническим причинам 0 называется точкой и обознача- ется знаком «•», а 1 называется тире и обозначается знаком «—». Имеем: 1/4 + 1/16 4- 1/16 4- 1/8 4-1/2 + 1/16 4- 1/8 + 1/16 4-1/4 4-1/16 4- 4-1/8 4-1/16 4-1/4 4-1/4 4-1/8 4-1/16 4-1/16 4-1/8 4-1/8 4- 4-1/2 4-1/8 4-1/16 + 1/8 + 1/16 + 1/16 + 1/16 = = 2/2 4- 4/4 4- 7/8 4-12/16 = 3 4- 5/8 > 1. Таким образом, неравенство Макмиллана для азбуки Морзе не выполнено, и эта схема не является разделимой. На самом деле в азбуке Морзе имеются дополни- тельные элементы — паузы между буквами (и словами), которые позволяют де- кодировать сообщения. Эти дополнительные элементы определены неформаль- но, поэтому прием и передача сообщений с помощью азбуки Морзе, особенно с высокой скоростью, является некоторым искусством, а не простой технической процедурой. 6.2. Кодирование с минимальной избыточностью Для практики важно, чтобы коды сообщений имели по возможности наимень- шую длину. Алфавитное кодирование пригодно для любых сообщений, то есть S = А*. Если больше про множество S ничего не известно, то точно сформули- ровать задачу оптимизации затруднительно. Однако на практике часто доступна дополнительная информация. Например, для текстов на естественных языках известно распределение вероятности появления букв в сообщении. Использова- ние такой информации позволяет строго поставить и решить задачу построения оптимального алфавитного кодирования. 6.2.1. Минимизация длины кода сообщения Если задана разделимая схема алфавитного кодирования а — (at -4 то лю- бая схема а' = (а, —> где /З'п) является перестановкой /?„), также будет разделимой. Если длины элементарных кодов равны, то перестанов- ка элементарных кодов в схеме не влияет на длину кода сообщения. Но если дли- ны элементарных кодов различны, то длина кода сообщения зависит от состава букв в сообщении и от того, какие элементарные коды каким буквам назначены.
166 Глава 6. Кодирование Если заданы конкретное сообщение и конкретная схема кодирования, то нетруд- но подобрать такую перестановку элементарных кодов, при которой длина кода сообщения будет минимальна. Пусть — количества вхождений букв ai,...,an в сообщение S, а Ij,..., 1п — длины элементарных кодов ft,...,fln, соответственно. Тогда, если ki < kj lj, то kili 4- kjlj kilj + kjli. Действительно, пусть kj = к 4- a, ki = к nlj = I, Ц — I + b, где а, b 0. Тогда {kilj + kjli) — (l^ili 4- k,jlj} — (kl 4- (fc 4- o)(Z 4- b)) — (k(l 4* b) 4- l(k 4- a)) = = (fcZ + al + bk + ab 4- kl) — (kl + al + kl + bk) = ab 0. Отсюда вытекает алгоритм назначения элементарных кодов, при котором длина кода конкретного сообщения S будет минимальна: нужно отсортировать буквы в порядке убывания количества вхождений, элементарные коды отсортировать в порядке возрастания длины и назначить коды буквам в этом порядке. ЗАМЕЧАНИЕ--------------------------------------------------------------- Этот простой метод решает задачу минимизации длины кода только для фиксированного сообщения S и фиксированной схемы <г. 6.2.2. Цена кодирования Пусть заданы алфавит А — {ai,...,an} и вероятности появления букв в сооб- щении Р — (pi,... ,pn) (pi — вероятность появления буквы а,). Не ограничивая общности, можно считать, что Pi 4 \-рп = 1 и р\ - рп > 0 (то есть можно сразу исключить буквы, которые не могут появиться в сообщении, и упорядочить буквы по убыванию вероятности их появления). Для каждой (разделимой) схемы а = (at —> ft)"=1 алфавитного кодирования ма- тематическое ожидание коэффициента увеличения длины сообщения при коди- ровании (обозначается 1а) определяется следующим образом: п la(Р): = ^2Pih, где Ц: = |ft | i=i и называется средней ценой (или длиной) кодирования ст при распределении ве- роятностей Р. Пример Для разделимой схемы А = {а,Ь}, В = {0,1}, <5 — {а -> 0,5 -> 01} при распреде- лении вероятностей (0.5,0.5) цена кодирования составляет 0.5 * 1 4- 0.5 * 2 = 1.5, а при распределении вероятностей (0.9,0,1) она равна 0.9 * 1 4- 0.1 * 2 = 1.1. Обозначим Р): = inf ZCT(P), Р» : = mj-OPt. /J =[log2(n - l)j 4-1
6.2. Кодирование с минимальной избыточностью 167 Очевидно, что всегда существует разделимая схема а — {а^ -»/?г)”=1, такая что Vi \/3i\ = L. Такая схема называется схемой равномерного кодирования. Следова- тельно, 1 < L и достаточно учитывать только такие схемы, для которых Vi pili L, где Ц — целое и Ц L/p*. Таким образом, имеется лишь конечное число схем а, для которых Z.(P) < ZCT(P) L. Следовательно, существует схема <т., на которой инфимум достигается: iCT„(P) = 1*(Р}- Алфавитное (разделимое) кодирование <т„ для которого 1а.(Р) = М-Р)> называ- ется кодированием с минимальной избыточностью, или оптимальным кодирова- нием, для распределения вероятностей Р. 6.2.3. Алгоритм Фано Следующий рекурсивный алгоритм строит разделимую префиксную схему ал- фавитного кодирования, близкого к оптимальному. Алгоритм 6.1. Построение кодирования, близкого к оптимальному Вход: Р : array [l..n] of real — массив вероятностей появления букв в сообщении, упо- рядоченный по невозрастанию; 1 > Р[1] > > Р[п] > О, Р[1] 4-1- P[n] = 1. Выход: С : array [l..n, 1..L] of 0..1 — массив элементарных кодов. Fano(l,n, 0) { вызов рекурсивной процедуры Fano } Основная работа по построению элементарных кодов выполняется следующей рекурсивной процедурой Fano. Вход: Ь — индекс начала обрабатываемой части массива Р, е — индекс конца обрабаты- ваемой части м'ассива Р, к — длина уже построенных кодов в обрабатываемой части массива С. Выход: заполненный массив С. if е > Ь then к: = к + 1 { место для очередного разряда в коде } т: = Med(b, е) { деление массива на две части } for i from b to e do C[i, k]:—i>m{B первой части добавляем 0, во второй — 1 } end for Fano(b, т, к) { обработка первой части } Fano(m + 1, е, к) { обработка второй части } end if Функция Med находит медиану указанной части массива Р[6..е], то есть опреде- ляет такой индекс т (Ъ т < е), что сумма элементов Р[Ь..т] наиболее близка к сумме элементов Р[т + 1..е]. Вход: Ь — индекс начала обрабатываемой части массива Р, е — индекс конца обрабаты- ваемой части массива Р. тп е Выход: т — индекс медианы, то есть min у Р[г] — У Р[г] i—b Sb: = 0 { сумма элементов первой части } for г from Ь to е — 1 do
168 Глава 6. Кодирование Sb: = Sb + P[z] { вначале все, кроме последнего } end for Se : = Р[е] { сумма элементов второй части } т: = е { начинаем искать медиану с конца } repeat d: = Sb — Se { разность сумм первой и второй части } т: = т — 1 { сдвигаем границу медианы вниз } Sb : = Sb - P[m]; Se : = Se + P[m] until |Sb — Se\~^d return m Обоснование При каждом удлинении кодов в одной части коды удлиняются нулями, а в дру- гой — единицами. Таким образом, коды одной части не могут быть префиксами другой. Удлинение кода заканчивается тогда и только тогда, когда длина части равна 1, то есть остается единственный код. Таким образом, схема по построению префиксная, а потому разделимая. □ Пример Коды, построенные алгоритмом Фано для заданного распределения вероятностей (п = 7). Pi СИ li 0.20 00 2 0.20 010 3 0.19 on 3 0.12 100 3 0.11 101 3 0.09 110 3 0.09 111 3 1ЛР) 2.80 6.2.4. Оптимальное кодирование Оптимальное кодирование обладает определенными свойствами, которые можно использовать для его построения. ЛЕММА Пусть а = — схема оптимального кодирования для распре- деления вероятностей Р = рп > 0. Тогда если pi > pj, то It С lj. Доказательство От противного. Пусть i < j, pi > pj и Ц > lj. Тогда рассмотрим fo-i > /?1, • •., a-i fij,..., a>j > ..., > fin}-
6.2. Кодирование с минимальной избыточностью 169 Имеем: fc' — (Pili + Pjlj') (.Pilj "I" Pjli} ~ (.Pi Pjitli 0) ** что противоречит тому, что <т — оптимально. □ Таким образом, не ограничивая общности, можно считать, что li 1п. ЛЕММА Если а = {at /3i)"=1 — схема оптимального префиксного кодирования для распределения вероятностей Р = pi > рп > 0, то среди элементарных кодов, имеющих максимальную длину, имеются два, которые различаются только в последнем разряде. Доказательство От противного. 1. Пусть кодовое слово максимальной длины одно и имеет вид fln = /ЗЬ, где b — О V b = 1. Имеем: Vi € l..n - 1 Ц |/3|. Так как схема префиксная, то слова /31,... ,/Зп-1 не являются префиксами /3. С другой стороны, /3 не явля- ется префиксом слов /31,... ,/3n-i., иначе было бы /3 = /Зу а значит, /Зу было бы префиксом (Зп. Тогда схема а': =(ai -> /31,..., ап —» /3) тоже префиксная, причем 1а'(Р) = 1а(Р) — Рп, что противоречит оптимальности а. 2. Пусть теперь два кодовых слова /Зп—i и /Зп максимальной длины отличают- ся не в последнем разряде, то есть /Зп_1 — /З'У, /3„ — /3' / /3", при- чем /3', /3" не являются префиксами для /Зх,..., /3„_2 и наоборот. Тогда схема a' :=(ai -> /3i,...,a„_2 -> /3n_2,an_i -> 0'b',an -> /3") также является пре- фиксной, причем la’(P') = k(-P) — Рп, что противоречит оптимальности а. □ ТЕОРЕМА Если an-i = tfli -> — схема оптимального префиксного коди- рования для распределения вероятностей Р = pi pn-i > 0 и pj — q' + q", причем Pi^ Pj-i pj+i > • • > Pn-i q' > q" > o, то кодирование co схемой o’n = («i -> /3i,. • , ay-i -> -> (3j+i,..., an—i /Зп—i^aj > 0jO,an > /3jl) является оптимальным префиксным кодированием для распределения вероятно- стей Рп = pi,... ,рг_1,р7+1,... ,pn-i,q',q". Доказательство 1. Если <тп—1 было префиксным, то ап тоже будет префиксным по построению.
170 Глава 6. Кодирование 2- /<7„(-Рп) = Pih +Р2^2 Н---------hPj-iZj-i +pj+ilj+i -f----Ь + Pn-iJn-i + 9^j+i + rf'lj+i — — Pili 4----hPn-iln-i + ij(q' + q") + (<f + ч") — = Pill 4----+Pn-Jn-1 + IjPj +Pj = lan^dpn-l) +Pj 3. Пусть схема a'n : — {a, -> Д}”=1 оптимальна для Рп. Тогда по предшествующей лемме <т„ = {ах -> /3J,...,an_2 -> /3'n-2>an-i -> /30, ап -> /31J. Положим Г = \/3\ и рассмотрим схему : ={ах -> (3{,..., a,j -> ап_2 -+ /З'п_2}’ где j определено так, чтобы pj-j q' + q" Pj+i- 4. l<r'n(pn) — liPi + • • • + in-2Pn-2 + (I' + l)<f + (I' + l)q" — — liPi + —l- ln-2Pn-2 +1'(я' + q") + {q + </') = = 1о'п_1{Рп—1) + Pj- 5. a'n — префиксное, значит, тоже префиксное. 6. ffn-i — оптимально, значит, Zffn_1(Pn_1). 7. k„(Pn) = 1<гп_ЛРп-1) + Pj la^Pn-i) + Pj = Z<(-Pn), HO < - оптимально, значит, ап оптимально. □ 6.2.5. Алгоритм Хаффмена Следующий рекурсивный алгоритм строит схему оптимального префиксного ал- фавитного кодирования для заданного распределения вероятностей появления букв. Алгоритм 6.2. Построение оптимальной схемы — рекурсивная процедура Huffman Вход: п — количество букв, Р : array of real — массив вероятностей букв, упорядо- ченный по убыванию. Выход: С : array [l..n, 1..L] of 0..1 — массив элементарных кодов, t: array [l..n] of 1..L — массив длин элементарных кодов схемы оптимального префиксного кодирования. if п = 2 then С[1,1]: = 0; t[1]: = 1{ первый элемент } С[2,1]: = 1; €[2]: = 1{ второй элемент } else q: = P[n — 1] + P[n] { сумма двух последних вероятностей } j: = Up(n, q) { поиск места и вставка суммы } Huffman(P, п — 1) { рекурсивный вызов } Down(n,J) { достраивание кодов } end if Функция Up находит в массиве Р место, в котором должно находиться число q (см. предыдущий алгоритм) и вставляет это число, сдвигая вниз остальные эле- менты.
6.2. Кодирование с минимальной избыточностью 171 Вход: п — длина обрабатываемой части массива P,q — вставляемая сумма. Выход: измененный массив Р. for г from п — 1 downto 2 do if P[i — lj < q then P[i]: = P[i — 1]{ сдвиг элемента массива } else j : = i — 1{ определение места вставляемого элемента } exit for i { все сделано — цикл не нужно продолжать } end if end for P[j]: = q { запись вставляемого элемента } return j Процедура Down строит оптимальный код для п букв на основе построенного оптимального кода для п — 1 буквы. Для этого код буквы с номером j временно исключается из массива С путем сдвига вверх кодов букв с номерами, большими j, а затем в конец обрабатываемой части массива С добавляется пара кодов, полученных из кода буквы с номером j удлинением на 0 и 1, соответственно. Здесь С[г, *] означает вырезку из массива, то есть i-ю строку массива С. Вход: п — длина обрабатываемой части массива Р, j — номер «разделяемой» буквы. Выход: оптимальные коды в первых п элементах массивов С и t. с: = C'[j,*]{ запоминание кода буквы j } Z: = ф]{ и длины этого кода } for i from j to n — 2 do C[i, *]: = (7[i +1, *]{ сдвиг кода } ^[i]: — t[i + 1] { и его длины } end for C[n — 1, *]: = c;C[n, *]: = c{ копирование кода буквы j } C[n — 1,1 + 1]: = 0; C[n, I + 1]: = 1{ наращивание кодов } t[n — 1]: = I + 1; £[n]: = I + 1{ и увеличение длин } Обоснование Для пары букв при любом распределении вероятностей оптимальное кодирова- ние очевидно: первой букве нужно назначить код 0, а второй — 1. Именно это и делается в первой части оператора if основной процедуры Huffman. Рекурсивная часть алгоритма в точности следует доказательству теоремы предыдущего под- раздела. С помощью функции Up в исходном упорядоченном массиве Р отбрасы- ваются две последние (наименьшие) вероятности, и их сумма вставляется в мас- сив Р, так чтобы массив (на единицу меньшей длины) остался упорядоченным. Заметим, что при этом место вставки сохраняется в локальной переменной j. Так происходит до тех пор, пока не останется массив из двух элементов, для которого оптимальный код известен. После этого в обратном порядке строятся оптималь- ные коды для трех, четырех и т. д. элементов. Заметим, что при этом массив ве- роятностей Р уже не нужен — нужна только последовательность номеров кодов, которые должны быть изъяты из массива кодов и продублированы в конце с до- бавлением разряда. А эта последовательность хранится в экземплярах локальной переменной j, соответствующих рекурсивным вызовам процедуры Huffman. □
172 Глава 6. Кодирование Пример Построение оптимального кода Хаффмена для п = 7. В левой части таблицы показано изменение массива Р, .,а в правой части — массива С, Позиция, соот- ветствующая текущему значению переменной j, выделена полужирным начерта- нием. 0.20 0.20 0.23 0.37 0.40 0.60 0 1 00 01 10 10 0.20 0.20 0.20 0.23 0.37 0.40 1 00 01 10 и и 0.19 0.19 0.20 0.20 0.23 01 10 и 000 000 0.12 0.18 0.19 0.20 и 000 001 010 0.11 0.12 0.18 001 010 011 0.09 0.11 011 0010 0.09 ООП Цена кодирования составляет 0.20 х 2 + 0.20 х 2 + 0.19 х 3 + 0.12 х 3 + 0.11 х 3 + 0.09 х 4 + 0.09 х 4 = 2.78, что несколько лучше, чем в кодировании, полученном алгоритмом Фано. 6.3. Помехоустойчивое кодирование Надежность электронных устройств по мере их совершенствования все время возрастает, но, тем не менее, в их работе возможны ошибки, как систематиче- ские, так и случайные. Сигнал в канале связи может быть искажен помехой, по- верхность магнитного носителя может быть повреждена, в разъеме может быть потерян контакт. Ошибки аппаратуры ведут к искажению или потере передавае- мых или хранимых данных. При определенных условиях, некоторые из которых рассматриваются в этом разделе, можно применять методы кодирования, позво- ляющие правильно декодировать исходное сообщение, несмотря на ошибки в данных кода. В качестве исследуемой модели достаточно рассмотреть канал свя- зи с помехами, потому что к этому случаю легко сводятся остальные. Например, запись на диск можно рассматривать как передачу данных в канал, а чтение с диска — как прием данных из канала. 6.3.1. Кодирование с исправлением ошибок Пусть имеется канал связи С, содержащий источник помех: S-^S' где S — множество переданных, aS' — соответствующее множество принятых по каналу сообщений. Кодирование F, обладающее таким свойством, что S -Z+ К К' S, Vs G S , = s;
6.3. Помехоустойчивое кодирование 173 называется помехоустойчивым, или самокорректирующимся, или кодированием с исправлением ошибок. Без ограничения общности можно считать, что А — В = {0,1}, и что содержа- тельное кодирование выполняется на устройстве, свободном от помех. 6.3.2. Классификация ошибок Ошибки в канале могут быть следующих типов: ► 0 —> 1, 1 -> 0 — ошибка типа замещения разряда; ► 0 —» Л, 1 -+ Л — ошибка типа выпадения разряда; ► Л -» 1, Л -> 0 — ошибка типа вставки разряда. Канал характеризуется верхними оценками количества ошибок каждого типа, которые возможны при передаче через канал сообщения определенной длины. Общая характеристика ошибок канала (то есть их количество и типы) обознача- ется 5. Пример Допустим, что имеется канал с характеристикой 5 = (1,0,0), то есть в канале воз- можна одна ошибка типа замещения разряда при передаче сообщения длины п. Рассмотрим следующее кодирование: F(a) : = ааа (то есть каждый разряд в со- общении утраивается) и декодирование F~1(abc): — a + b + c > 1 (то есть разряд восстанавливается методом «голосования»). Это кодирование кажется помехо- устойчивым для данного канала, однако на самом деле это не так. Дело в том, что при передаче сообщения длины Зп возможно не более 3 ошибок типа заме- щения разряда, но места этих ошибок совершенно не обязательно распределены равномерно по всему сообщению. Ошибки замещения могут произойти в сосед- них разрядах, и метод голосования восстановит разряд неверно. 6.3.3. Возможность исправления всех ошибок Пусть Е3 — множество слов, которые могут быть получены из слова s в ре- зультате всех возможных комбинаций допустимых в канале ошибок 6, то есть s € S С А*, Е° с В*. Если s' е Е°, то та конкретная последовательность оши- бок, которая позволяет получить из слова s слово s', обозначается Es(s, s'). Если тип возможных ошибок в канале подразумевается, то индекс S не указывается. ТЕОРЕМА Чтобы существовало помехоустойчивое кодирование с исправлением всех ошибок, необходимо и достаточно, чтобы Vsl,s2 € S ES1 Г) ES2 = 0, то есть необходимо и достаточно, чтобы существовало разбиение множества В* на множества Bs (\^BS = В*, f}Bs = 0), такое что У s € S Es С Bs. Доказательство Если кодирование помехоустойчивое, то очевидно, что Е31 Г) ES2 = 0. Обратно: по разбиению (J В3 строится функция F-1: V s' g В3 F-1 (s'): = s. □
174 Глава 6. Кодирование Пример Рассмотрим канал, в котором в любом передаваемом разряде происходит ошибка типа замещения с вероятностью р (0 < р < 1 /2), причем замещения различных разрядов статистически независимы. Такой канал называется двоичным симме- тричным. В этом случае любое слово s & Е£ может быть преобразовано в любое другое слово s' € замещениями разрядов. Таким образом, Vs Es = Е£, и исправить все ошибки в двоичном симметричном канале невозможно. 6.3.4. Кодовое расстояние Неотрицательная функция d(x,у): М х М —» R+ называется расстоянием (или метрикой) на множестве М, если выполнены следующие условия (аксиомы ме- трики): 1. d(x, у) = 0 <=> х = у, 2. d(x,y) = d(y,x), 3. d(x, у) d(x, z) + d(y, z). Пусть , I И11П{Е5(Д’,Д")} \Es{ft',ft")\, (3"eEpt, ft"<£E*,. Эта функция называется расстоянием Хэмминга. ЗАМЕЧАНИЕ-------------------------------------------------------- Мы рассматриваем симметричные ошибки, то есть если в канале допустима ошибка 0 —> 1, то допустима и ошибка 1 —> 0. Введенная функция ds является расстоянием. Действительно: 1. ds(ft',ft') = 0 <==> ft' = ft", поскольку ошибки симметричны, и из последова- тельности E{ft',ft") можно получить последовательность E{ft",ft'}, применяя обратные ошибки в обратном порядке. 2. ds(ft', ft") = ds(ft",ft") по той же причине. 3. ds(ft',ft") jC ds(ft',ft'") + ds(ft",ft'”), поскольку E{ft',ft'") U E{ft'",ft") является некоторой последовательностью, преобразующей ft' в ft*', a ds (ft* 1 2 3, ft") является кратчайшей из таких последовательностей. Пусть а = (fli -> Дг)"=1 — схема некоторого алфавитного кодирования, a d — некоторая метрика на Б*. Тогда минимальное расстояние между элементарными кодами d(cr): = min d{fti,ftj) называется кодовым расстоянием схемы <т.
6.3. Помехоустойчивое кодирование 175 ТЕОРЕМА Алфавитное кодирование со схемой а = -» /3,)?=1 и с кодовым рас- стоянием является кодированием с исправлением р ошибок типа 8 тогда и только тогда, когда d$(a) > 2р. Доказательство Е(х) — это шар радиуса р с центром в х для канала, который допускает не более р ошибок типа 8. Таким образом, Е((3') П Е(Д") =0^ds{a)> 2р по теореме 6.3.3. Пример Расстояние Хэмминга в E%: d(J3',/3") := / ДО- «=1 6.3.5. Код Хэмминга для исправления одного замещения Рассмотрим построение кода Хэмминга, который позволяет исправлять одиноч- ные ошибки типа замещения. Очевидно, что для исправления ошибки вместе с основным сообщением нужно передавать какую-то дополнительную информацию. Пусть сообщение а = aj...ат кодируется словом [3 = Ь\.. ,Ьп, п > т. Обозна- чим к: = п — т. Пусть канал допускает не более одной ошибки тийа замещения в слове длины п. ОТСТУПЛЕНИЕ------------------------------------------------------ Рассматриваемый случай простейший, но одновременно практически очень важный. Та- ким свойством, как правило, обладают внутренние шины передачи данных в современных компьютерах. При заданном п количество дополнительных разрядов к подбирается таким обра- зом, чтобы 2к > n +1. Имеем: 2П 2П 2* > п + 1 ==»----> 2п~к =>------ > 2т. п + 1 п +1 Пример Для сообщения длиной т — 32 потребуется к — 6 дополнительных разрядов, поскольку 64 = 26 > 32 + 6 + 1 = 39. Определим последовательности натуральных чисел в соответствии с их предста- влениями в двоичной системе счисления следующим образом:
176 Глава 6. Кодирование > Vi: — 1,3,5,7,9,11,... — все числа, у которых разряд №1 равен 1; > V2 : = 2,3,6,7,10,... — все числа, у которых разряд №2 равен 1; > V3 : = 4,5,6,7,1'2,... — все числа, у которых разряд №3 равен 1, и т. д. По определению последовательность Vk начинается с числа 2fc-1. Рассмотрим в слове Ьг... Ьп к разрядов с номерами 2° — 1, 21 = 2, 22 = 4, ... 2fc-1. Эти разряды назовем контрольными. Остальные разряды, а их ровно т, навовем информационными. Поместим в информационные разряды все разряды слова ах... ап как они есть. Контрольные разряды определим следующим обра- зом: > 61: — &з ф ф i>7 ф..., — то есть все разряды с номерами из Vi, кроме первого; ► 62 : = &з Ф Ъ6 Ф 67 Ф • •, — то есть все разряды с номерами из V2, кроме первого; ► 64 : = Ь5 фЪ6 ф 67 ф..., — то есть все разряды с номерами из V3, кроме первого; и вообще, 31 а = Пусть после прохождения через канал получен код сг... Сп, то есть ел... сп : = С(Ь], .... Ьп), причем _£ Vi / I d = bi. bi Здесь I — номер разряда, в котором, возможно, произошла ошибка замещения. Пусть это число имеет следующее двоичное представление: I — ц..Аг. Определим число J = ji... ji следующим образом: ► ji: = ci ф с3 ф с5 ф С7 ф ..., — то есть все разряды с номерами из Vi; ► З2 = с2 ф сз ф се Ф С7 ф ..., — то есть все разряды с номерами из V2; ► Зз = с4 ф с5 ф се Ф bi ф,.., — то есть все разряды с номерами из V3, и вообще, Зр •сд- gevp ТЕОРЕМА I = J. Доказательство Эти числа равны, потому что поразрядно равны их двоичные представления. Действительно, пусть = 0. Тогда I $ Уъ и значит, Ji = ci ф с3 ф с5 ф • • • = 61 ф 63 ф 65 ф • • • = О
6.4. Сжатие данных 177 по определению разряда bi„ Пусть теперь ii — 1. Тогда I € Vi, и значит, Ji = С1 ф с3 ф с5 ф • • • = Ьг ф Ьз ф Ь5 Ф • • • ф Ъх ф • • • = 1, так как если в сумме по модулю два изменить ровно один разряд, то изменится и значение всей суммы. Итак, гг = ji. Аналогично (используя последовательности V2 и т. д.) имеем г2 = j2 и т. д. Таким образом, I = J. □ Отсюда вытекает метод декодирования с исправлением ошибки: нужно вычи- слить число J. Если J = 0, то ошибки нет, иначе cj: = cj. После этого из ис- правленного сообщения извлекаются информационные разряды, которые уже не содержат ошибок. 6.4. Сжатие данных Материал раздела 6.2 показывает, что при кодировании наблюдается некоторый баланс между временем и памятью. Затрачивая дополнительные усилия при ко- дировании и декодировании, можно сэкономить память, и, наоборот, пренебрегая оптимальным использованием памяти, можно существенно выиграть во времени кодирования и декодирования. Конечно, этот баланс имеет место только в опре- деленных пределах, и нельзя сократить расход памяти до нуля или построить мгновенно работающие алгоритмы кодирования. Для алфавитного кодирования пределы возможного установлены в разделе 6.2. Для достижения дальнейшего прогресса нужно рассмотреть неалфавитное кодирование. 6.4.1. Сжатие текстов Допустим, что имеется некоторое сообщение, которое закодировано каким-то об- щепринятым способом (для текстов это, например, код ASCII) и хранится в па- мяти компьютера. Заметим, что равномерное кодирование (в частности, ASCII) не является оптимальным для текстов. Действительно, в текстах обычно исполь- зуется существенно меньше, чем 256 символов (в зависимости от языка — при- мерно 60-80 с учетом знаков препинания, цифр, строчных и прописных букв). Кроме того, вероятности появления букв различны и для каждого естественного языка известны (с некоторой точностью) частоты появления букв в тексте. Та- ким образом, можно задаться некоторым набором букв и частотами их появления в тексте и с помощью алгоритма Хаффмена построить оптимальное алфавитное кодирование текстов (для заданного алфавита и языка). Простые расчеты по- казывают, что такое кодирование для распространенных естественных языков будет иметь цену кодирования несколько меньше 6, то есть даст выигрыш по сравнению с кодом ASCII на 25% или несколько больше. ЗАМЕЧАНИЕ-------------------------------------------------------- Методы кодирования, которые позволяют построить (без потери информации!) коды со- общений, имеющие меньшую длину по сравнению с исходным сообщением, называются методами сжатия (или упаковки) данных. Качество сжатия определяется коэффицентом сжатия, который обычно измеряется в процентах и показывает, на сколько процентов кодированное сообщение короче исходного.,
178 Глава 6. Кодирование ' Известно, что практические программы сжатия (arj, zip и другие) имеют гораздо лучшие показатели: при сжатии текстовых файлов коэффициент сжатия достига- ет 70% и более. Это означает, что в таких программах используется не алфавитное кодирование. 6.4.2. Предварительное построение словаря Рассмотрим следующий способ кодирования. 1. Исходное сообщение по некоторому алгоритму разбивается на последователь- ности символов, называемые словами (слово может иметь одно или несколько вхождений в исходный текст сообщения). 2. Полученное множество слов считается буквами нового алфавита. Для этого алфавита строится разделимая схема алфавитного кодирования (равномер- ного кодирования или оптимального кодирования, если для каждого слова подсчитать число вхождений в текст). Полученная схема обычно называется словарем, так как она сопоставляет слову код. 3. Далее код сообщения строится как пара — код словаря и последовательность кодов слов из данного словаря. 4. При декодировании исходное сообщение восстанавливается путем замены ко- дов слов на слова из словаря. Пример Допустим, что требуется кодировать тексты на русском языке. В качестве алго- ритма деления на слова примем естественные правила языка: слова отделяются друг от друга пробелами или знаками препинания. Можно принять допущение, что в каждом конкретном тексте имеется не более 216 различных слов (обычно гораздо меньше). Таким образом, каждому слову можно сопоставить номер — це- лое число из двух байтов (равномерное кодирование). Поскольку в среднем слова русского языка состоят более чем из двух букв, такое кодирование дает суще- ственное сжатие текста (около 75% для обычных текстов на русском Языке). Если текст достаточно велик (сотни тысяч или миллионы букв), то дополнительные затраты на хранение словаря оказываются сравнительно небольшими. ЗАМЕЧАНИЕ---------------------------------------------------------- Данный метод попутно позволяет решить задачу полнотекстового поиска, то есть опре- делить, содержится ли заданное слово (или слова) в данном тексте, причем для этого не нужно просматривать весь текст (достаточно просмотреть только словарь). Указанный метод можно усовершенствовать следующим образом. На шаге 2 сле- дует применить алгоритм Хаффмена для построения оптимального кода, а на ша- ге 1 — решить экстремальную задачу разбиения текста на слова таким образом, чтобы среди всех возможных разбиений выбрать то, которое дает наименьшую
6.4. Сжатие данных 179 цену кодирования на шаге 2. Такое кодирование будет «абсолютно» оптималь- ным. К сожалению, указанная экстремальная задача очень трудоемка, поэтому на практике не используется — время на предварительную обработку большого текста оказывается чрезмерно велико. 6.4.3. Алгоритм Лемпела—Зива На практике используется следующая идея, которая известна также как ада- птивное сжатие. За один проход по тексту одновременно динамически строится словарь и кодируется текст. При этом словарь не хранится — за счет того, что при декодировании используется тот же самый алгоритм построения словаря, словарь динамически восстанавливается. Здесь приведена простейшая реализация этой идеи, известная как алгоритм Лемпела—Зива. Вначале словарь D : array [int] of string содержит пустое сло- во, имеющее код 0. Далее в тексте последовательно выделяются слова. Выделяе- мое слово — это максимально длинное слово из уже имеющихся в словаре плюс еще один символ. В сжатое представление записывается найденный код слова и расширяющая буква, а словарь пополняется расширенной комбинацией. Алгоритм 6.3. Упаковка по методу Лемпела-Зива Вход: исходный текст, заданный массивом кодов символов f : array [l..n] of char. Выход: сжатый текст, представленный последовательностью пар (р, q), где р — номер слова в словаре, q — код дополняющей буквы. Z>[0]: = ””; d: = 0 { начальное состояние словаря } к: = 1 { номер текущей буквы в исходном тексте } while к п do р: = FD(fc) { р — индекс найденного слова в словаре } I: — Length(D[p]) { I — длина найденного слова в словаре } yield (р, f[k + ф { код найденного слова и еще одна буква } d: = d + 1; D[d]: = D[p] U f [A: + /] { пополнение словаря, здесь U — это конкатенация } к: = к + I + 1 { продвижение вперед по исходному тексту } end while Слово в словаре ищется с помощью несложной функции FD. Вход: к — номер символа в исходном тексте, начиная с которого нужно искать в тексте слова из словаря. Выход: р — индекс самого длинного слова в словаре, совпадающего с символами /[/с][fc + 1]. Если такого слова в словаре нет, то р = 0. I: = 0; р: = 0 { начальное состояние } for i from 1 to d do if £>[i] = f[k..k + Length(D[i]) — 1] Length(D[i]) > I then p: = i; I; = Length(D[i]) { нашли более подходящее слово } end if end for return p Распаковка осуществляется следующим алгоритмом.
180 Глава 6. Кодирование Алгоритм 6.4. Распаковка по методу Лемпела-Зива Вход: сжатый текст, представленный массивом-пар д : array of record p : int; q char endrecord, где p — номер слова в словаре, q — код дополняющей буквы. Выход: исходный текст, заданный последовательностью строк и символов. 0(0]: = ””; d: = 0 { начальное состояние словаря } for к < п do р: = g[fc] .р { р — индекс слова в словаре } 9: — Я И-9 { 9 — дополнительная буква } yield р U q { вывод слова и еще одной буквы } d: = d + 1; D[d]: = D[p] U q { пополнение словаря, здесь U — это конкатенация } end for ЗАМЕЧАНИЕ-------------------------------------------------------------------- На практике применяют различные усовершенствования этой схемы. 1. Словарь можно сразу инициализировать, например, кодами символов (то есть считать, что одпобуквенные слова уже известны). 2. В текстах часто встречаются регулярные последовательности: пробелы и табуляции в таблицах и т. п. Сопоставлять каждой подпоследовательности такой последовательно- сти отдельное слово в словаре нерационально. В таких случаях лучше применить спе- циальный прием, например, закодировать последовательность пробелов парой (к, s), где к — количество пробелов, as- код пробела. 6.5. Шифрование Защита компьютерных данных от несанкционированного доступа, искажения и уничтожения в настоящее время является серьезной социальной проблемой. Применяются различные подходы к решению этой проблемы. ► Поставить между злоумышленником и данными в компьютере непреодоли- мый барьер, то есть исключить саму возможность доступа к данным путем физической изоляции компьютера с данными, применения аппаратных клю- чей защиты и т. п. Такой подход надежен, но он затрудняет доступ к данным и легальным пользователям, а потому постепенно уходит в прошлое. ► Поставить между злоумышленником и данными в компьютере логический ба- рьер, то есть проверять наличие прав на доступ к данным и блокировать до- ступ при отсутствии таких прав. Для этого применяются различные системы паролей, регистрация и идентификация пользователей, разграничения прав доступа и т. п. Практика показывает, что борьба между «хакерами» и модуля- ми защиты операционных систем идет с переменным успехом. ► Хранить данные таким образом, чтобы они могли «сами за себя постоять». Другими словами, так закодировать данные, чтобы даже получив их, злоумыш- ленник не смог бы нанести ущерба. Этот раздел посвящен обсуждению методов кодирования, применяемых в по- следнем случае.
6.5. Шифрование 181 6.5.1. Криптография Шифрование — это кодирование данных с целью защиты от несанкционирован- ного доступа. Процесс кодирования сообщения называется шифрованием (или зашифровкой), а процесс декодирования — расшифровыванием (или расшифровкой). Само коди- рованное сообщение называется шифрованным (или просто шифровкой), а при- меняемый метод называется шифром. Основное требование к шифру состоит в том, чтобы расшифровка (и, может быть, зашифровка) была возможна только при наличии санкции, то есть некото- рой дополнительной информации (или устройства), которая называется ключом шифра. Процесс декодирования шифровки без ключа называется дешифрованием (или дешифрацией, или просто раскрытием шифра). Область знаний о шифрах, методах их создания и раскрытия называется кри- птографией (или тайнописью). Свойство шифра противостоять раскрытию называется криптостойкостью (или надежностью) и обычно измеряется сложностью алгоритма дешифрации. ОТСТУПЛЕНИЕ------------------------------------------------------ В практической криптографии криптостойкость шифра оценивается из экономических со- ображений.. Если раскрытие шифра стоит (в денежном выражении, включая необходимые компьютерные ресурсы, специальные устройства и т. п.) больше, чем сама зашифрованная информация, то шифр считается достаточно надежным. Криптография известна с глубокой древности и использует самые разнообразные шифры, как чисто информационные, так и механические. В настоящее время наибольшее практическое значение имеет защита данных в компьютере, поэтому далее рассматриваются программные шифры для сообщений в алфавите {0,1}. 6.5.2. Шифрование с помощью случайных чисел Пусть имеется датчик псевдослучайных чисел, работающий по некоторому опре- деленному алгоритму. Часто используют следующий алгоритм: Ti+i: =(а -Ti + b) mod с, где Ti — предыдущее псевдослучайное число, Ti+i — следующее псевдослучайное число, а коэффициенты а, Ь, с постоянны и хорошр известны. Обычно с = 2П, где п — разрядность процессора, a mod 4 = 1, а b — нечетное (см. [9]). В этом случае последовательность псевдослучайных чисел имеет период с (см. [9]). Процесс шифрования определяется следующим образом. Шифруемое сообще- ние представляется в виде последовательности слов So, S),..., каждое длины п, которые складываются по модулю 2 со словами последовательности Т0,Т\,..., то есть
182 Глава 6. Кодирование ЗАМЕЧАНИЕ----------------------------------- Последовательность То,Ti,... называется гаммой шифра. Процесс расшифровывания заключается в том, чтобы еще раз сложить шифро- ванную последовательность с той же самой гаммой шифра: Ключом шифра является начальное значение 7Ь, которое является секретным и должно быть известно только отправителю и получателю шифрованного сооб- щения. ЗАМЕЧАНИЕ---------------------------------------------------------- Шифры, в которых для зашифровки И расшифровки используется один и тот же ключ, называются симметричными. Если период последовательности псевдослучайных чисел достаточно велик, что- бы гамма шифра была длиннее сообщения, то дешифровать сообщение можно только подбором ключа. При увеличении п экспоненциально увеличивается кри- птостойкость шифра. ОТСТУПЛЕНИЕ------------------------------------------------------— Это очень простой и эффективный метод часто применяют «внутри» программных систем, например, для защиты данных на локальном диске. Для защиты данных, передаваемых по открытым каналам связи, особенно в случае многостороннего обмена сообщениями, этот метод применяют не так часто, поскольку возникают трудности с надежной передачей секретного ключа многим пользователям. 6.5.3. Криптостойкость Описанный в предыдущем подразделе метод шифрования обладает существен- ным недостатком. Если известна хотя бы часть исходного сообщения, то все сообщение может быть легко дешифровано. Действительно, пусть известно одно исходное слово Si. Тогда Ti: = Ci®Si, и далее вся правая часть гаммы шифра определяется по указанной формуле дат- чика псевдослучайных чисел. ЗАМЕЧАНИЕ------------------------------------------------------- На практике часть сообщения вполне может быть известна злоумышленнику. Например, многие текстовые редакторы помещают в начало файла документа одну и ту же служеб- ную информацию. Если злоумышленнику известно, что исходное сообщение подготовле- но в данном редакторе, то он сможет легко дешифровать сообщение. Для повышения криптостойкости симметричных шифров применяют различные приемы:
6.5. Шифрование 183 1. вычисление гаммы шифра по ключу более сложным (или секретным) спосо- бом; 2. применение вместо ф более сложной (но обратимой) операции для вычисле- ния шифровки; 3. предварительное перемешивание битов исходного сообщения по фиксирован- ному алгоритму. Наиболее надежным симметричным шифром считается DES (Data Encryption Standard), в котором используется сразу несколько методов повышения крипто- стойкости. В настоящее время широкое распространение получили шифры с открытым ключом. Эти шифры не являются симметричными — для зашифровки и расши- фровки используются разные ключи. При этом ключ, используемый для заши- фровки, является открытым (не секретным) и может быть сообщен всем жела- ющим отправить шифрованное сообщение, а ключ, используемый для расши- фровки, является закрытым и хранится в секрете получателем шифрованных сообщений. Даже знание всего зашифрованного сообщения и открытого ключа, с помощью которого оно было зашифровано, не позволяет дешифровать сообще- ние (без знания закрытого ключа). Для описания метода шифрования е открытым ключом нужны некоторые факты из теории чисел, изложенные (без доказательств) в следующем подразделе. 6.5.4. Модулярная арифметика В этом подразделе все числа целые. Говорят, что число а сравнимо по модулю п с числом b (обозначение: а = b (mod п)), если а и b при делении на п дают один и тот же остаток: а = Ь (mod n): = a mod п — b mod п. Отношение сравнимости рефлексивно, симметрично и транзитивно и является отношением эквивалентности. Классы эквивалентности по отношению сравни- мости (по модулю п) называются вычетами (по модулю п). Множество вычетов по модулю п обозначается Zn. Обычно из каждого вычета выбирают одного пред- ставителя — неотрицательное число, которое при делении на п дает частное 0. Это позволяет считать, что Zn = {0,1,2,..., п — 1}, и упростить обозначения. Над вычетами (по модулю п) определены операции сложения и умножения по модулю п, обозначаемые, соответственно, +п и -п и определяемые следующим образом: a+n6:=(a + 6) mod п, a-nb:=(a-b) mod п. ЗАМЕЧАНИЕ----------------------------------------------------------- Если из контекста ясно, что подразумеваются операции по модулю п, то индекс п опус- кается. Легко видеть, что (Zn; +п) образует абелеву группу, a (Zn; +п, -п) — коммутатив- ное кольцо с единицей.
184 Глава 6. Кодирование Рассмотрим Z* — подмножество Zn чисел, взаимно простых, с ту ЗАМЕЧАНИЕ----------------------------------------------~--------- Числа а и Ъ называются взаимно простыми, если их наибольший общий делитель равен 1, Можно показать, что (Z*;-n) — абелева группа. Таким образом, для чисел из множества Z* существуют обратные по умножению по модулю п. ЗАМЕЧАНИЕ--------------------------------------------------------- Если п — простое число, то (Z„; +п, -п) является полем. Функция <р(п) : = |Z*| называется функцией Эйлера. ЗАМЕЧАНИЕ--------------------------------------------------------- Если р — простое число, то <р(р) = р — 1, и вообще, <р(п) < п. Можно показать, что <p(n) — nil-------- где pi,... ,Pk — все простые делители п. Имеет место следующая теорема. ТЕОРЕМА (Эйлера) Если п > 1, то Ча € Z* а4^ = 1 (mod п). Отсюда непосредственно выводима ТЕОРЕМА (малая теорема Ферма) Если р > 1 — простое число, то Va G Z* ар 'al (mod р). Имеет место следующее утверждение. ТЕОРЕМА Если числа щ,..., Пк попарно взаимно простые, число п = гцп2 ... и*, — их произведение, х и а — целые числа, то х = a (mod п) <==> Vi € l..k х = а (mod rip. ЗАМЕЧАНИЕ------------------------------------------------------------ Последнее утверждение является следствием теоремы, которая известна как «китайская теорема об остатках».
6.5. Шифрование 185 6.5.5. Шифрование с открытым ключом Шифрование с открытым ключом производится следующим образом. 1. Получателем сообщений производится генерация открытого ключа (пара чи- сел п и е) и закрытого ключа (число d). Для этого: ► выбираются два простых числа р и д; ► определяется первая часть открытого ключа n:=pq; ► определяется вторая часть открытого ключа — выбирается небольшое не- четное число е, взаимно простое с числом (р — l)(g — 1) (заметим, что (р - l)(g - 1) = рд(1 - 1/р)(1 - 1/д) = <р(п)); ► определяется закрытый ключ: d: =е-1 mod ((р- l)(g — 1)). После чего открытый ключ (числа п и е) сообщается всем отправителям со- общений. 2. Отправитель шифрует сообщение (разбивая его, если нужно, на слова S, дли- ной менее log2 п разрядов): Ci: =(Si)e mod п и отправляет получатели* 3. Получатель расшифровывает сообщение с помощью закрытого ключа d: Pi:=(Ci)d mod n. ТЕОРЕМА Шифрование с открытым ключом корректно, то есть в предыдущих обозначениях Pi = S,. Доказательство Легко видеть, что Pi = (Si)ed mod п. Покажем, что VM < п Med = М mod п. Действительно, числа d и е взаимно обратны по модулю (р — 1)(д — 1), то есть ed = 1 + k(p — 1)(д — 1) при некотором к. Если М 0 (mod р), то по малой теореме Ферма имеем: Med = М = М = М (mod р). Если М = 0 (mod р), то сравнение Med = М (mod р), очевидно, выполняется. Таким образом, VO М < п Med = М (mod р). Совершенно аналогично имеем VO М < п Med = М (mod q),
186 Глава 6. Кодирование и по следствию к китайской теореме об остатках^ VM < п Med = М (mod п). Поскольку Si < п и Pi < п, заключаем, что Vi Pi = Si. □ Пример Генерация ключей: 1. р: = 3, q: = 11; 2. п: = pq — 3 * 11 — 33; 3. (р — 1)(q — 1) = 2 * 10 = 20, е: = 7; 4. d: — 7~r mod 20 — 3, (7 * 3 mod 20 — 1). Пусть Si: = 3, S2 : = 1, S3: = 2 (Si, S2, S3^< n = 33). Тогда код определяется сле- дующим образом. 1. Ci: = З7 mod 33 = 2187 mod 33 = 9; 2. С2 : = I7 mod 33 = 1 mod 33 = 1; 3. C3: = 27 mod 33 = 128 mod 33 = 29. При расшифровке имеем: 1. Pi: = 93 mod 33 = 729 mod 33 = 3; 2. P2 : = I3 mod 33 = 1 mod 33 = 1; 3. P3: = 293 mod 33 = 24389 mod 33 = 2. ОТСТУПЛЕНИЕ------------------------------------------------------- Шифры с открытым ключом сравнительно просты в реализации, очень практичны (по- скольку нет необходимости пересылать по каналам связи закрытый ключ и можно без- опасно хранить его в одном месте) и в то же время обладают высочайшей криптостой- костью. Кажется, что дешифровать сообщение несложно: достаточно разложить открыто опубликованное число п на множители, восстановив числа р и q, и далее можно легко вычислить секретный ключ d. Однако дело заключается в следующем. В настоящее время известны эффективные алгоритмы определения простоты чисел, которые позволяют за несколько минут подобрать пару очень больших простых чисел (по 100 и больше цифр в десятичной записи). В то же время неизвестны эффективные алгоритмы разложения очень больших чисел на множители. Разложение на множители числа в 200 и больше цифр потребовало бы сотен лет работы Самого лучшего суперкомпьютера. При практическом применении шифров с открытым ключом используют действительно большие простые числа (не менее 100 цифр в десятичной записи, а обычно значительно больше). В ре- зультате вскрыть этот шифр оказывается невозможно, если не существует эффективных алгоритмов разложения на множители (что очень вероятно, хотя и не доказано строго).
6.5. Шифрование 187 6.5.6. Цифровая подпись Шифр с открытым ключом позволяет выполнять и многие другие полезные опе- рации, помимо шифрования и посылки сообщений в одну сторону. Прежде все- го, для организации многосторонней секретной связи каждому из участников достаточно сгенерировать свою пару ключей (открытый и закрытый), а затем сообщить всем партнерам свой открытый ключ. Заметим, что операции зашифровки и расшифровки по существу одинаковы, и различаются только показателем степени, а потому коммутируют: М — (Me)d mod п = Med mod п = Mde mod n — (Me)d mod n = M. Это обстоятельство позволяет применять различные приемы, известные как ци- фровая (или электронная) подпись. Рассмотрим следующую схему взаимодействия корреспондентов X и Y. Отпра- витель X кодирует сообщение S своим закрытым ключом (С: = Md mod п) и посылает получателю Y пару (S,C), то есть подписанное сообщение. Получа- тель Y, получив такое сообщение, кодирует подпись сообщения открытым клю- чом X, то есть вычисляет S': = Се mod п. Если оказывается, что S = S!, то это означает, что (нешифрованное!) сообщение S действительно было отправлено корреспондентом X. Если же S S', то сообщение было искажено при передаче или фальсифицировано. ОТСТУПЛЕНИЕ------------------------------------------------------- В подобного рода схемах возможны различные проблемы, которые носят уже не мате- матический, а социальный характер. Например, допустим, что злоумышленник Z имеет техническую возможность контролировать всю входящую корреспонденцию Y незаметно для последнего. Тогда, перехватив сообщение X, в’котором сообщался открытый ключ е, злоумышленник Z может подменить открытый ключ X своим собственным открытым ключом. После этого злоумышленник сможет фальсифицировать все сообщения X подпи- сывая их своей цифровой подписью, и, таким образом, действовать от имени X. Другими словами, цифровая подпись удостоверяет, что сообщение S пришло из того же источника, из которого был получен открытый ключ е, но не более того. Можно подписывать и шифрованные сообщения. Для этого отправитель X сна- чала кодирует своим закрытым ключом сообщение S, получая цифровую под- пись С, а затем кодирует полученную пару {S, С) открытым ключом получате- ля Y. Получив такое сообщение, Y сначала расшифровывает его своим закрытым ключом, а потом убеждается в подлинности полученного сообщения, сравнив его с результатом применения открытого ключа X к подписи С. ЗАМЕЧАНИЕ---------------------------—----------------------------- К сожалению, даже эти меры не смогут защитить от злоумышленника Z, сумевшего под- менить открытый ключ X. Конечно, в этом случае Z не сможет дешифровать исходное сообщение, но он сможет подменить исходное сообщение фальсифицированным.
188 Глава 6. Кодирование Комментарии Вопросы, затронутые в этой главе, очень существенны для практических инфор- мационных технологий, которые невозможны без кодирования, сжатия данных и шифрования. Разумеется, в реальных современных программах применяются более изощренные, по сравнению с описанными здесь простейшими варианта- ми, методы. Общие вопросы кодирования достаточно подробно описаны в [1.7] и [25]. По вопросам сжатия данных, помимо специальной литературы, см. (18]. Шифрованию посвящено множество специальных монографий. Лаконичное из- ложение основных идей можно найти в [16]. Алгоритм 5.1 общеизвестен. Прочие алгоритмы этой главы заимствованы (в переработанном виде) из [17]. Упражнения 6.1. Является ли схема алфавитного кодирования {а -> О, b -> 10, с -> Oil, d -> 1011, е 1111) префиксной? разделимой? 6.2. Построить оптимальное префиксное алфавитное кодирование для алфавита {а, Ь, с, d} со следующим распределением вероятностей появления букв: ра - 1/2, рь = 1/4, рс = 1/8, pd = 1/8. 6.3. Показать, что для несимметричных ошибок функция d5tf= 2 min max ( min \E5 (/?',,/?"')|, min , является расстоянием. 6.4. Проследить работу алгоритма сжатия Лемпела—Зива на примере следующе- го исходного текста: abaabaaab. 6.5. Пусть в системе программирования имеется процедура Randomize, которая получает целочисленный параметр и инициализирует датчик псевдослучай- ных чисел, и функция без параметров Rnd, которая выдает следующее псев- дослучайное число в интервале [0,1]. Составить алгоритмы шифровки и рас- шифровки с закрытым ключом.
ГЛАВА 7 Графы Эта глава открывает вторую часть книги, целиком посвященную графам и ал- горитмам на них. Среди дисциплин и методов дискретной математики теория графов и особенно алгоритмы на графах находят наиболее широкое примене- ние в программировании. Как показано в разделе 7.5, между понятием графа и понятием отношения, рассмотренным в главе 1, имеется глубокая связь — в сущности это равнообъемные понятия. Возникает естественный вопрос, почему же тогда графам оказывается столь явное предпочтение? Дело в том, что тео- рия графов предоставляет очень удобный язык для описания программных (да и многих других) моделей. Этот тезис можно пояснить следующей аналогией. Понятие отношения также можно полностью выразить через понятие множества (см. замечание в подразделе 1.5.1 и далее). Однако независимое определение понятия отношения удобнее — введение специальных терминов и обозначений упрощает изложение теории и делает ее более понятной. То же относится и к теории графов. Стройная система специальных терминов и обозначений тео- рии графов позволяют просто и доступно описывать сложные и тонкие вещи. Особенно важно наличие наглядной графической интерпретации понятия графа (подраздел 7.1.4). Само название «граф» подразумевает наличие графической ин- терпретации. Картинки позволяют сразу «усмотреть» суть дела на интуитивном уровне, дополняя и украшая утомительные рациональные текстовые доказатель- ства и сложные формулы. Эта глава практически полностью посвящена описанию языка теории графов. 7.1. Определения графов Как это ни удивительно, но для понятия «граф» нет общепризнанного едино- го определения. Разные авторы, особенно применительно к разным приложени- ям, называют «графом» очень похожие, но все-таки различные объекты. Здесь используется терминология [23], которая была выбрана из соображений макси- мального упрощения определений и доказательств.
190 Глава 7. Графы 7.1.1. История теории графов Теория графов многократно переоткрывалась разными авторами при решении различных прикладных задач. 1. Задача о Кенигсбергских мостах. Обойти все четыре части суши, пройдя по каждому мосту один раз, и вернуться в исходную точку (рис. 7.1). Эта задача была решена Эйлером1 в 1736 году. Рис. 7.1. Иллюстрация к задаче о Кенигсбергских мостах 2. Задача о трех домах и трех колодцах. Имеется три дома и три колодца. Про- вести от каждого дома к каждому колодцу тропинку так, чтобы тропинки не пересекались (рис. 7.2). Эта задача была решена Куратовским2 в 1930 году. Рис. 7.2. Иллюстрация к задаче о трех домах и трех колодцах 3. Задача о четырех красках. Любую карту на плоскости раскрасить четырьмя красками так, чтобы никакие две соседние области не были закрашены одним цветом (рис. 7.3). 1Леонард Эйлер (1707-1783) 2Куратовский (1896-1979)
7.1. Определения графов 191 Рис. 7.3. Иллюстрация к задаче о четырех красках 7.1.2. Основное определение Графом G(y, Е) называется совокупность двух множеств — непустого множества V (множества вершин) и множества Е неупорядоченных пар различных элемен- тов множества V (Е — множество ребер). G(V,E) = (V;E), V^0, EcVxV, E = E~1. Число вершин графа G обозначим р, а число ребер — q- р:=р(С); = |П д:=9(С): = |^|. 7.1.3. Смежность Пусть i?i, 1?2 — вершины, е = (vi,v2) — соединяющее их ребро. Тогда вершина г»! и ребро е инцидентны, вершина v2 и ребро е также инцидентны. Два ребра, инцидентные одной вершине, называются смежными; две вершины, инцидентные одному ребру, также называются смежными. Множество вершин, смежных с вершиной v, называется множеством смежности вершины v и обозначается Г+(г>): Г+(«): = {йё V | (и,и) е Я}, r(v): = r*(v):^r+(v)U{i»}, и е Г(ц) <==> v е Г(и). ЗАМЕЧАНИЕ----------------------------------------------------—— Если не оговорено противное, то подразумевается Г+ и обозначается просто Г. Если Л С V — множество вершин, то Г(Л) — множество всех вершин, смежных с вершинами из А: Г(Л): = {ие V | 3i? е Л и е Г(и)} = |J Г(г>)-
192 Глава 7. Графы 7.1.4. Диаграммы Обычно граф изображают диаграммой-, вершины — точками (или кружками), ребра — линиями. Пример На рис. 7.4 приведен пример диаграммы графа, имеющего четыре вершины и пять ребер. В этом графе вершины «1 и v2, v2 и из, «з и v4, v4 и v2 и и4 смежны, а вершины vi и v3 не смежны. Смежные ребра: ei и е2, е2 и ез, е3 и е4, е4 и ei, ei и е5, е2 и е5, ез и е5, е4 и е5. Несмежные ребра: ei и е3, е2 и е4. Рис. 7.4. Диаграмма графа 7.1.5. Другие определения Часто рассматриваются следующие родственные графам объекты. 1. Если элементами множества Е являются упорядоченные пары, то граф назы- вается ориентированным (или орграфом). В этом случае элементы множества V называются узлами, а элементы множества Е — дугами. 2. Если элементом множества Е может быть пара одинаковых (не различных) элементов V, то такой элемент множества Е называется петлей, а граф назы- вается графом с петлями (или псевдографом). 3. Если Е является не множеством, а набором, содержащим несколько одинако- вых элементов, то эти элементы называются кратными ребрами, а граф назы- вается мулътиграфом. 4. Если элементами множества Е являются не обязательно двухэлементные, а любые подмножества множества V, то такие элементы множества Е называ- ются гипердугами, а граф называется гиперграфом. 5. Если задана функция F: V -> М и/или F: Е -> М, то множество М называ- ется множеством пометок, а граф называется помеченным (или нагруженным). В качестве множества пометок обычно используются буквы или целые числа. Далее выражение «граф G(y,E)» означает неориентированный непомеченный граф без петель и кратных ребер.
7.1. Определения графов 193 7.1.6. Изоморфизм графов Говорят, что два графа Gi(Vi,Ei) и G2(y2,E2) изоморфны (обозначается G1 ~ G2), если существует биекция h: Vi -> V2, сохраняющая смежность: 61 = (u,v) е Ег => е2 = (/г(и),/г(г>)) е Е2, е2 = (и, v) е Е2 ==> ег — (/i-1(u),/i_1(v)) е Ег. Изоморфизм графов есть отношение эквивалентности. Действительно, изомор- физм обладает всеми необходимыми свойствами: .1. рефлексивность: G ~ G, где требуемая биекция суть тождественная функция; 2. симметричность: если <7г ~ G2 с биекцией h, то G2 ~ Gi с биекцией /i-1; 3. транзитивность: если Gi ~ G2 с биекцией /г и G2 ~ G3 с биекцией д, то Gi ~ G3 с биекцией д о h. Графы рассматриваются с точностью до изоморфизма, то есть рассматриваются классы эквивалентности по отношению изоморфизма (см. раздел 2.2). Пример Три внешне различные диаграммы, приведенные на рис. 7.5, являются диаграм- мами одного и того же графа К3,з. Рис. 7.5. Диаграммы изоморфных графов Числовая характеристика, одинаковая для всех изоморфных графов, называется инвариантом графа. Так, p(G) и g(G) — инварианты графа G. Не известно никакого набора инвариантов, определяющих граф с точностью до изоморфизма. Пример Количество вершин, ребер и количество смежных вершин для каждой вершины не определяют граф. На рис. 7.6 представлены диаграммы графов, у которых указанные инварианты совпадают, но графы при этом не изоморфны.
194 Глава 7. Графы Рис. 7.6. Диаграммы неизоморфных графов с совпадающими инвариантами 7.2. Элементы графов После рассмотрения определений, относящихся к графам как к цельным объек- там, естественно дать определения различным составным элементам графов. 7.2.1. Подграфы Граф G'(V, Е') называется подграфом графа G(V, Е) (обозначается G' с G), если V' с V и/или Е' с Е. Если V = V, то G' называется остовным подграфом G. Если V С V&E' С E&(W '-J Е' Е), то граф G' называется собственным подграфом графа G. Подграф G'(y',E') называется правильным подграфом графа G(V, Е), если G' содержит все возможные ребра G: V и, v е V (u, v) € Е => (и, v) е Е'. Правильный подграф G'(V', Е') графа G(V, Е) определяется подмножеством вер- шин V. 7.2.2. Валентность Количество ребер, инцидентных вершине v, называется степенью (или валент- ностью) вершины v и обозначается d(v): V 0^d(v) ^р-1, d(v) = |Г(г»)|. Обозначим минимальную степень вершины графа G через 5(G), а максималь- ную — через Д(С): 5 (G(V, E))t = min d(v), Д (G(V, E)): = max d(v). v£V v£V Если степени всех вершин равны к, то граф называется регулярным степени к: 5(G) = Д(С) = к. Степень регулярности является инвариантом графа и обозначается r(G). Для нерегулярных графов r(G) не определено. Пример На рис. 7.7 приведена диаграмма регулярного графа степени 3.
7.2. Элементы графов 195 Рис. 7.7. Диаграмма регулярного графа степени 3 Если степень вершины равна 0 (то есть d(y) = 0), то вершина называется изолиро- ванной. Если степень вершины равна 1 (то есть d(y) = 1), то вершина называется концевой, или висячей. Для орграфа число дуг, исходящих из вершины v, называется полустепенью исхо- да, а входящих — полустепенью захода. Обозначаются эти числа, соответственно, d~(y) и d+(v).. ТЕОРЕМА (Эйлера) Сумма степеней вершин графа равна удвоенному количеству ребер: '^,d{v) = 2q, ^2d_(v) +J2d+(w) = 2<? v^V Доказательство При подсчете суммы степеней вершин каждое ребро учитывается два раза: для одного конца ребра и для другого. □ 7.2.3. Маршруты, цепи, циклы Маршрутом в графе называется чередующаяся последовательность вершин и ребер v0, ei, i>i, е2, v2,..., с*,, Vk, в которой любые два соседних элемента инцидентны. ЗАМЕЧАНИЕ----------------------------------------------------------— Это определение подходит также для псевдо-, мульти- и орграфов. Для «обычного» графа достаточно указать только последовательность вершин или только последовательность ребер. Если vo = Vk, то маршрут замкнут, иначе открыт. Если все ребра различны, то маршрут называется цепью. Если все вершины (а значит, и ребра) различны, то маршрут называется простой цепью. В цепи vo,ei,... ,ek,Vk вершины v0 и Vk называются концами цепи. Говорят, что цепь с концами и и v соединяет вершины и и v. Цепь, соединяющая вершины и и v, обозначается (u,v). Очевидно, что если есть цепь, соединяющая вершины и и v, то есть и простая цепь, соединяющая эти вершины.
196 Глава 7. Графы Замкнутая цепь называется циклом; замкнутая простая цепь называется простым циклом. Число циклов в графе G обозначается z(G). Граф без циклов называется ациклическим. Для орграфов цепь называется путем, а цикл — контуром. Пример В графе, диаграмма которого приведена на рис. 7.8: 1. гц, г>з, Vi, v4 — маршрут, но не цепь; 2. Vi, из, и5, v2, г>з, v4 — цепь, но не простая цепь; 3. гц, V4, г>з, г>2, г>5 — простая цепь; 4. i»i, v3, v3, v2, v3, v4, vi — цикл, но не простой цикл; 5. vlt v3, v4 — простой цикл. Рис. 7.8. Маршруты, цепи, циклы 7.2.4. Расстояние между вершинами Длиной маршрута называется количество ребер в нем (с повторениями). Если маршрут М = v0,ei,vi,e2,V2,. . ,ekVk, то длина М равна к (обозначается \М\ = к). Расстоянием между вершинами и и v (обозначается d(u,v)) называется длина кратчайшей цепи {u,v), а сама кратчайшая цепь называется геодезической. ЗАМЕЧАНИЕ ----------------------------—----------------------------- Если -G (и, v), то по определению d(u, v): = +оо. Диаметром графа G (обозначается D(G')) называется длина длиннейшей геоде- зической. Множество вершин, находящихся на одинаковом расстоянии п от вершины v (обозначение D(v, п)), называется ярусом'. D(y, п): = {и е V | d(y, и) — п}.
7.3. Виды графов и операции над графами 197 7.2.5. Связность Говорят, что две вершины в графе связаны, если существует соединяющая их (простая) цепь. Граф, в котором все вершины связаны, называется связным. Отношение связанности вершин является эквивалентностью. Классы эквива- лентности по отношению связанности называются компонентами связности гра- фа. Число компонент связности графа G обозначается k{G). Граф G является связным тогда и только тогда, когда k(G) = 1. Если k(G) > 1, то G — несвязный граф. Граф, состоящий только из изолированных вершин (в котором k(G) = p(G) и r(G) = 0), Называется вполне несвязным. 7.3. Виды графов и операции над графами В данном разделе рассматриваются различные частные случаи графов и вводят- ся операции над графами и их элементами. Заметим, что не все из используемых обозначений операций над графами являются традиционными и общеприняты- ми. 7.3.1. Тривиальные и полные графы Граф, состоящий из одной вершины, называется тривиальным. Граф, состоящий из простого цикла с к вершинами, обозначается С^. Пример Сз — треугольник. Граф, в котором каждая пара вершин смежна, называется полным. Полный граф с р вершинами обозначается Кр, он имеет максимально возможное число ребер: Полный подграф (некоторого графа) называется кликой (этого графа). 7.3.2. Двудольные графы Двудольный граф (или биграф, или четный граф) — это граф G(V,E), такой что множество V разбито на два непересекающихся множества Vi и V2 (Vi U V2 = V & Vi П V2 = 0), причем всякое ребро из Е инцидентно вершине из Ц и вершине из V2 (то есть соединяет вершину из Vi с вершиной из V2). Множества Vi и V2 называются долями двудольного графа. Если двудольный граф содержит все ребра, соединяющие множества Vi и V2, то он называется полным двудольным графом. Если |Щ = т и |Vi| = п, то полный двудольный граф обозначается Кт,п. Пример На рис. 7.9 приведена диаграмма графа Л'з.з-
198 Глава 7. Графы Рис. 7.9. Диаграмма графа Кз,з ТЕОРЕМА Граф является двудольным тогда и только тогда, когда все его про- стые циклы имеют четную длину. Доказательство Необходимость. От противного. Пусть G(Vi, V2; Е) — двудольный граф, и Vi, v2, . . , v2k+i, i>i — простой цикл не- четной длины. Пусть Vi € Vi, тогда v2 € V2, v3 € Ц, V4 € V2,..., v2fc-bi € Vi. Имеем: vltv2k+i € Vi и (yi,v2k+i) E E, что противоречит двудольности. Достаточность. Не ограничивая общности, можно считать, что G — связный граф, поскольку каждую компоненту связности можно рассматривать отдельно. Разо- бьем множество V на Vi и V2 с помощью следующей процедуры: Вход: граф G( V, Е). Выход: Множества Vi и V2 — доли графа. select v € V { произвольная вершина } V i: = v { в начале первая доля содержит v, ... } V 2 : — 0 { ... а вторая пуста } for и € V \ {и} do if d(y, и) — четно then V i: = Vi U {u} { в первую долю } else V 2 : = V2 U {u} { во вторую долю } end if end for Далее от противного. Пусть есть две вершины в одной доле, соединенные ребром. Пусть для определенности и, w € V2 и (u, w) € Е. Рассмотрим геодезические (v, и) и (у, w) (здесь v — та произвольная вершина, ко- торая использовалась в алгоритме построения долей графа). Тогда длины | (у, и) | и | (v, w) | нечетны. Эти геодезические имеют общие вершины (по крайней мере, вершину v). Рассмотрим наиболее удаленную от v общую вершину геодезиче- ских (у,и) и (y,w) и обозначим ее v' (может оказаться так, что v = v'). Имеем: | (у', и) | + | («', w) | = | (у, и) | + | (у, w) | - 2| (у, v') | — четно, и v',..., и, w,..., v' — простой цикл нечетной длины, что противоречит условию. Если же и, w е Vi, то
1.3. Виды графов и операции над графами 199 длины | (и, и) | и | (v, w) | четны и аналогично имеем: v',..., и, w,..., v' — простой цикл нечетной длины. □ 7.3.3. Направленные орграфы и сети Если в графе ориентировать все ребра, то получится орграф, который называется направленным. Направленный орграф, полученный из полного графа, называется турниром. ОТСТУПЛЕНИЕ----------------------------------------------------- Название «турнир» имеет следующее происхождение. Рассмотрим спортивное соревно- вание для пар участников (или пар команд), где не предусматриваются ничьи. Пометим вершины орграфа участниками и проведем дуги от победителей к побежденным. В таком случае турнир в смысле теории графов — это как раз результат однокругового турнира в спортивном смысле. Если в орграфе полустепень захода некоторой вершины равна нулю (то есть d+(y) = 0), то такая вершина называется источником, если же нулю равна полу- степень исхода (то есть d~(v) = 0), то вершина называется стоком. Направлен- ный орграф с одним источником й одним стоком называется сетью. 7.3.4. Операции над графами Введем следующие операции над графами: 1. Дополнением графа G(V1,E'i) (обозначение — Gi(V1,E'1)) называется граф G(V2,E2), где V2 : = Vi &Е2: = Ёг: ={е &V1xVl\e^ Е^}. 2. Объединением графов Gi(Vi,Ei) и G2(V2,E'2) (обозначение — G1(Vi,E'i)UG2(V2,E'2), при условии PinV2 = 0, = 0) называется граф G(V,E), где V: = Vi U V2 &сЕ: = Е\ U Е% • Пример #з,з = G3 U G3. 3. Соединением графов Gi(Vi,Ei) и G2(V2,E'2) (обозначение — Gi(Vi,E'i) + G2(V2,E'2), при условии Vinl^ = 0, -EiO-E^ = 0) называется граф G(V, Е), где V: = Vi О V2 &: Е: = Е± U Е2 U {е = (гц, и2) | гц ё Vi v2 G V2} Пример Кт,п — Кт + Кп.
200 Глава 7. Графы 4. Удаление вершины v из графа <34(14, £4) (обозначение--** Gf(T4>М) v> ПРЙ условии v & V4) дает граф G2(V2, Е2), где V2 : = Vi \ {v}&E2: = Ei \ {е = (vi,w2) I «1 = v V v2 = v}. Пример Сз - v — К2. 5. Удаление ребра е из графа Gi(I4,£4) (обозначение — Gi(I4,Ei) — е, при усло- вии е € Е)) дает граф G2(V2, Е2), где V2: = V1&E2: = E1\{e}. Пример К2 — е = К2. 6. Добавление вершины v в граф Gi(Vi,Ei) (обозначение — Gi(Vi,-Ei) + v, при условии v 14) дает граф G2(V2,E2), где V2 : = Vj U {и} & Е2: = Е\. Пример G + v = G U Кг 7. Добавление ребра е в граф Gi(I4,Ei) (обозначение — Gi(Vi-, Ei)+e, при усло- вии е £ Ei) дает граф G2(y2, E2), где V2 : = Vi & Е2 : — Ei U {e}. 8. Стягивание подграфа А графа Gi(Vi,Ei) (обозначение — Gi(Vi,Ei)/A, при условии A C Vi) дает граф G2(V2,E2), где V2:=(Vi\A)U{v}& - Е2 : = Ei \ {е = (и, w) | и 6 А V w € A} U {е = (и, и) | и € Г(А) \ А} . Пример К4/С3 = к2. 9. Размножение вершины v графа Gi(Vi,£'i) (обозначение — Gi(Vi,Ei) f v, при условии А с Vi, v ё Vi,vz 14) дает граф G2(V2,-EI2), где V2 : = Vi U {vz} &Е2: = Ei U {(v, v')} U {е = (и, и') | и € Г+(и)} . Пример К2 f v = G3.
7.4. Представление графов в ЭВМ 201 7.4. Представление графов в ЭВМ Следует еще раз подчеркнуть, что конструирование структур данных для пред- ставления в программе объектов математической модели — это основа искус- ства практического программирования. Мы приводим четыре различных базовых представления графов. Выбор наилучшего представления определяется требова- ниями конкретной задачи. Более того, при решении конкретных задач исполь- зуются, как правило, некоторые комбинации или модификации указанных пред- ставлений, общее число которых необозримо. Но все они так или иначе основаны на тех базовых идеях, которые описаны в этом разделе. 7.4.1. Требования к представлению графов Известны различные способы представления графов в памяти компьютера, кото- рые различаются объемом занимаемой памяти и скоростью выполнения опера- ций над графами. Представление выбирается, исходя из потребностей конкрет- ной задачи. Далее приведены четыре наиболее часто используемых представле- ния с указанием характеристики п(р, q) — объема памяти для каждого предста- вления. Здесь р — число вершин, a q — число ребер. ЗАМЕЧАНИЕ------------------------------------------------- Указанные представления пригодны для графов и орграфов, а после некоторой модифи- кации также и для псевдографов, мультиграфов и гиперграфов. Представления иллюстрируются на конкретных примерах графа G и орграфа D, диаграммы которых представлены на рис. 7.10. Рис. 7.10. Диаграммы графа (слева) и орграфа (спрааа), используемых в качестве примеров 7.4.2. Матрица смежности Представление графа с помощью квадратной булевской матрицы М : array [l..p, 1 ..р] of 0..1, отражающей смежность вершин, называется матрицей смежности, где 11, если вершина Vi смежна с вершиной v,-, = < 10, если вершины и vj не смежны.
202 Глава 7. Графы Для матрицы смежности п(р, q) — О(р2). Пример 1 0 1 О 1 1 1 0 1 1 1 о 0 10 0 0 0 11 0 0 0 0 10 10 7.4.3. Матрица инциденций Представление графа с помощью матрицы Н : array [l..p, l..g] of 0..1 (для оргра- фов Н : array [l..p, l..g] of —1..1), отражающей инцидентность вершин и ребер, называется матрицей инциденций, где для неориентированного графа 1, о, если вершина Vi инцидентна ребру е7-, в противном случае, а для ориентированного графа 1, H[i, j] = < 0, -1, если вершина инцидентна ребру ej и является его концом, если вершина v, и ребро е7 не инцидентны, если вершина инцидентна ребру е, и является его началом. Для матрицы инциденций n(p,q) = O(pq). Пример 0 0 1 10 0 1 1 о 0 1 1 -10010 1-10 0-1 0 110 0 о 0—1—11 7.4.4. Списки смежности Представление графа с помощью списочной структуры, отражающей смежность вершин и состоящей из массива указателей Г : array [l..p] of f N на списки смеж- ных вершин (элемент списка представлен структурой N : record v : l..p; п :f N endrecord), называется списком смежности. В случае представления неориенти- рованных графов списками смежности n(p, q) = О(р + 2g), а в случае ориентиро- ванных графов п(р, q) = О(р + д). Пример Списки смежности для графа G и орграфа D представлены на рис. 7. D
7.4. Представление графов в ЭВМ 203 Рис. 7.11. Списки смежности для графа G (слева) и орграфа D (справа) 7.4.5. Массив дуг Представление графа с помощью массива структур Е : array [l..p] of record b,e : l..p endrecord, отражающего список пар смежных вершин, называется мас- сивом ребер (или, для орграфов, массивом дуг). Для массива ребер (или дуг) n(p,q) = O(2q). Пример Представление с помощью массива ребер (дуг) показано в следующей таблице (для графа G слева, а для орграфа D справа). Ь е Ь е 1 2 1 4 2 3 2 4 3 4 1 2 2 3 2 4 4 1 4 3 7.4.6. Обходы графов Обход графа — это некоторое систематическое перечисление его вершин (и/или ребер). Наибольший интерес представляют обходы, использующие локальную информацию (списки смежности). Среди всех обходов наиболее известны поиск в ширину и в глубину. Алгоритмы поиска в ширину и в глубину лежат в основе многих конкретных алгоритмов на графах. Алгоритм 7.1. Поиск в ширину и в глубину Вход: граф G(V, Е), представленный списками смежности Г. Выход: последовательность вершин обхода. for v G V do rr[v]: = 0{ вначале все вершины не отмечены } end for select v e V{ начало обхода — произвольная вершина } v —> Т{ помещаем v в структуру данных Т ... }
204 Глава 7. Графы ®[®]: = 1{ ... и отмечаем вершину v } repeat и <- Т{ извлекаем вершину из структуры данных Т ... } yield u{ ... и возвращаем ее в качестве очередной пройденной вершины } for w € Г(и) do if a:[w] = 0 then w -> Т{ помещаем w в структуру данных Т ... } o:[w]: = 1{ ... и отмечаем вершину w } end if end for until T = 0 Если T — это стек (LIFO — Last In First Out), то обход называется поиском в глубину. Если Т — это очередь (FIFO — First In First Out), то обход называется поиском в ширину. Пример В следующей таблице показаны протоколы поиска в глубину и в ширину для графа, диаграмма которого приведена на рис. 7.12. Слева в таблице протокол поиска в глубину, а справа — в ширину. Предполагается, что начальной является вершина 1. U Т и Т 1 2,4 1 2,4 4 2,3 2 4,3 3 2 4 3 2 0 3 0 Рис. 7.12. Диаграмма графа к примеру обхода в ширину и в глубину ТЕОРЕМА Если граф G связен (и конечен), то поиск в ширину и поиск в глубину обойдут все вершины по одному разу. Доказательство 1. Единственность обхода вершины. Обходятся только вершины, попавшие в Т. В Т попадают только неотмеченные вершины. При попадании в Т вершина отмечается. Следовательно, любая вершина будет обойдена не более одного раза.
7.4. Представление графов в ЭВМ 205 2. Завершаемость алгоритма. Всего в Т может попасть не более р вершин. На каждом шаге одна вершина удаляется из Т. Следовательно, алгоритм завершит работу не более чем через р шагов. 3. Обход всех вершин. От противного. Пусть алгоритм закончил работу, и вер- шина w не обойдена. Значит, ш не попала в Т. Следовательно, она не была отмечена. Отсюда следует, что все вершины, смежные с w, не были обойдены и отмечены. Аналогично, любые вершины, смежные с неотмеченными, сами не отмечены (после завершения алгоритма). Но G связен, значит, существует путь (v, w). Следовательно, вершина v не отмечена. Но она была отмечена на первом шаге! □ СЛЕДСТВИЕ Пусть (ui,..., щ,..., Uj,...,up) — обход (то есть последователь- ность вершин) при поиске в ширину Тогда Vi > j d(ui,Ui) d(ui,Uj). Другими словами, расстояние текущей вершины от начальной является моно- тонной функцией времени поиска в ширину, вершины обходятся в порядке воз- растания расстояния от начальной вершины. СЛЕДСТВИЕ Пусть (ui,..., и,,..., ир) — обход при поиске в глубину. Тогда Vi 1 < i < р. Другими словами, время поиска в глубину любой вершины не менее расстояния от начальной вершины и не более общего числа вершин, причем в худшем случае время поиска в глубину может быть максимальным, независимо от расстояния до начальной вершины. СЛЕДСТВИЕ Пусть (ui,..., , ир) — обход при поиске в ширину, a D(ui, 1), D(ui,2),... — ярусы графа относительно вершины щ,. Тогда d(ui,Ut)—1 d(ui,Ui) *5 12 l-Ofai’J)!- j=0 j=0 Другими словами, время поиска в ширину ограничено снизу количеством вер- шин во всех ярусах, находящихся на расстоянии меньшем, чем расстояние от начальной вершины до текущей, и ограничено сверху количеством вершин в ярусах, начиная с яруса текущей вершины и включая все меньшие ярусы. СЛЕДСТВИЕ Пусть (ui,,ир) — обход при поиске в ширину, а Vj,..., vp) — обход при поиске в глубину, где щ = Vj. Тогда в среднем i = 2j. Другими словами, поиск в глубину в среднем вдвое быстрее, чем поиск в ширину.
206 Глава 7. Графы 7.5. Орграфы и бинарные отношения Целью этого, заключительного раздела данной главы является установление свя- зи теории графов с другими разделами дискретной математики. 7.5.1. Графы и отношения Любой орграф G(V, Е) с петлями, но без кратных дуг, задает бинарное отношение Е на множестве V, и обратно. А именно, пара элементов принадлежит отношению (a, b) е Е с V х V тогда и только тогда, когда в графе G есть дуга (а, Ь). Полный граф соответствует универсальному отношению. Граф (неориентирован- ный) соответствует симметричному отношению. Дополнение графов есть допол- нение отношений. Изменение направления всех дуг соответствует обратному от- ношению. Гиперграф соответствует многоместному отношению и т. д. ОТСТУПЛЕНИЕ--------------------------------------------------- Таким образом, имеется полная аналогия между оргафами и бинарными отношениями — фактически, это один и тот же класс объектов, только описанный разными средствами. Отношения (в частности, функции), являются базовыми средствами для построения по- давляющего большинства математических моделей, используемых при решении практи- ческих задач. С другой стороны, графы допускают наглядное представление в виде диа- грамм. Это обстоятельство объясняет широкое использование диаграмм различного вида (которые суть представления графов или родственных объектов) при кодировании и осо- бенно при проектировании в программировании. 7.5.2. Достижимость и частичное упорядочение В качестве примера связи между орграфами и бинарными отношениями рассмо- трим отношения частичного порядка с точки зрения теории графов. Вершина и в орграфе G(V, Е) достижима из вершины v, если существует путь из v в и. Путь из v в и обозначим (u?v). Отношение достижимости можно представить матрицей Т : array [l..p, l..p] of 0..1, где T[i, j] = 1, если вершина Vj достижима из вершины и», и T[i, j] = 0, если вершина Vj недостижима из вершины v^. Рассмотрим отношение строгого частичного порядка >-, которое характеризуется следующими аксиомами: ► антирефлексивность: Vv € V -i(v >- и); ► транзитивность: Vu, и, w (у >~ wkw >- и => v >- и); ► антисмметричносты Vu,v ->(u >- v& v >- и). Отношению строгого частичного порядка хс V х V можно сопоставить граф G(V, Е), в котором а >- b 4=> (a, b) € Е. ТЕОРЕМА Если отношение Е есть строгое частичное упорядочение, то орграф G(V, Е) не имеет контуров.
7.5. Орграфы и бинарные отношения 207 Доказательство От противного. Пусть в G есть контур. Рассмотрим любую дугу (а,Ь) в этом контуре. Тогда имеем а >- Ь, но Ь >- а по транзитивности, что противоречит строгости упорядочения. □ ТЕОРЕМА Если орграф G(V,E) не имеет контуров, то достижимость есть строгое частичное упорядочение. Доказательство 1. Нет циклов, следовательно, нет петель, следовательно, достижимость антире- флексивна. 2. Если существуют пути из v в w и из w п и, то существует и путь из v в и. Следовательно, достижимость транзитивна. 3. Пусть достижимость — это не строгое упорядочение. Тогда v и>- v&v >- и, то есть существует путь из и в и и из и в и. Следовательно, существует контур (u,v) 4- (и/и), что противоречит условию. □ ТЕОРЕМА Если орграф не имеет контуров, то в нем есть вершина, полустепень захода которой равна 0. Доказательство От противного. Пусть такой вершины нет, тогда для любой вершины найдется вершина, из которой есть дуга в данную вершину. Следовательно, имеем контур против направления стрелок. □ ЗАМЕЧАНИЕ--------------------------------------------------------— Эта теорема позволяет найти минимальный элемент в конечном частично упорядоченном множестве, который требуется в алгоритме топологической сортировки (алгоритм 1.7). А именно, минимальный элемент — это источник, то есть вершина, которой в матрице смежности соответствует нулевой столбец. 7.5.3. Транзитивное замыкание Если Е — бинарное отношение на V, то транзитивным замыканием Е+ на V будет отношение достижимости на орграфе G(V, Е). ТЕОРЕМА Пусть М — матрица смежности орграфа G(V, Е). Тогда = 1 в том и только в том случае, если существует путь длиной к из вершины Uj в вершину Vj.
208 Глава 7. Графы Доказательство Индукция по к. База: к = 1, М1 = М — пути длины Пусть М*-1 содержит пути длины к - 1. Тогда р = у Mk^[i, z] & M[i, j], i=i то есть путь длины к из вершины i в вершину j существует тогда и только тогда, когда существуют вершина I, такая что существует путь длины к - 1 из i в I и дуга то есть 3(C) |(C)l = fc<^3z (Э(М) |(M)l = fc-i&GJ)eE). □ Если Т — матрица достижимости, то очевидно, что р т= \/мк. к=1 Трудоемкость прямого вычисления по этой формуле составит О(р4). Матрица достижимости Т может быть вычислена по матрице смежности М алгоритмом Уоршалла (алгоритм 1.8) за О(р3). Комментарии Эта глава является вводной главой второй части, поэтому здесь уместно привести беглый обзор учебной литературы По теории графов. Классическими учебниками по теории графов являются книги [2] и [23]. Первая является библографической редкостью, а последняя монография переиздавалась в нашей стране и является образцовой по глубине и широте охвата материала и одновременно по ясности и лаконичности изложения. Терминология и обозна- чения книги [23] взяты за основу в данном учебнике. Книга [23], хотя и имеет сравнительно небольшой объем, содержит большое число прекрасных упраж- нений и различные сведения справочного характера. В меньшей степени в ней представлены программистские аспекты теории графов. Существуют и другие доступные учебники по теории графов: [6, 21]. Послед- няя книга вполне доступна даже неподготовленному читателю, имеет небольшой объем, но в то же время вполне достаточна для первоначального знакомства. Раз- делы, посвященные теории графов, как правило, присутствуют во всех учебниках по дискретной математике, хотя такие разделы, по естественным причинам, не отличаются полнотой охвата материала. Особого упоминания заслуживают книги [И] и [5]. Содержание этих книг аб- солютно точно соответствует их названиям и является необходимым для про- граммиста дополнением к классическим монографиям типа [23]. Эти источники, особенно [11], в значительной мере повлияли на отбор материала для данного учебника.
Упражнения 209 Единственный в этой главе алгоритм 7.1 носит настолько общеизвестный ха- рактер, что трудно указать его источник. Идея этого алгоритма лежит в осно- ве огромноро числа конкретных алгоритмов на графах. Как правило, эта идея предполагается заранее известной читателю, и изложение сразу погружается в технические детали применения общей концепции поиска в ширину и в глуби- ну для решения конкретной задачи. В то же время свойства алгоритма поиска, приведенные в виде следствий к теореме, обосновывающей алгоритм 7.1, хотя и являются вполне тривиальными, не всегда осознаются практическими програм- мистами при решении задач. Именно поэтому представляется важным предпо- слать обсуждению конкретных алгоритмов на графах изложение общей идеи в предельно простой и рафинированной форме. Упражнения 7.1. Построить пример графов G\ и G2, для которых pi = р2, qi = qz, 5i = <S2, Ai = Д2, но Gi ф G2 (кроме примера подраздела 7.1.6). 7.2. Доказать, что в нетривиальном графе существуют вершины одинаковой сте- пени. 7.3. Задача Рамсея. Доказать, что среди любых 6 человек есть либо 3 попарно знакомых, либо 3 попарно незнакомых. 7.4. Рассмотрим матрицу смежности ребер Q : array [l..g, l..g] of 0..1, где 1, если ребро i смежно с ребром j, О, в противном случае. Является ли матрица смежности ребер Q представлением в ЭВМ графа G(V,E)? 7.5. Описать в терминах теории графов отношение эквивалентности на конечном множестве. Q[iJ] =
ГЛАВА 8 Связность Данная глава является центральной во второй части. Здесь обсуждается важное для приложений понятие связности, доказывается наиболее глубокая теорема — теорема Менгера и рассматриваются самые распространенные алгоритмы поиска кратчайших путей. 8.1. Компоненты связности В русском языке есть как слово «компонент» мужского рода, так и слово «компо- нента» женского рода, оба варианта допустимы. Современная языковая практика склоняется к использованию мужского рода, и мы ей следуем в остальной части книга. Однако исторически сложилось так, что «компонента связности» имеет женский род, и в этом случае мы подчиняемся традиции. 8.1.1. Объединение графов и компоненты связности Напомним, что если граф G состоит из одной компоненты связности (то есть k(G) = 1), то он называется связным. В связном графе любые две вершины со- единены (простой) цепью. ТЕОРЕМА Граф связен тогда и только тогда, когда его нельзя представить в виде объединения двух графов. Доказательство Необходимость. От противного. Пусть fc(G) = 1 и граф G состоит из двух ком- понент, то есть где 14 п 14 = 0, Ег п Е2 = 0, Vi / 0, V2 / 0. Возьмем гц е 14, v2 & V2. Тогда 3 (vx, v2> гц 6 14&г>2 6 V2. В этой цепи Зе = (а,Ь) а € 14 && € V2. Но тогда е £ £4, е £ Е2, следовательно, е £ £?.
8.1. Компоненты связности 211 Достаточность. От противного. Пусть k(G) > 1. Тогда 3u, v ->3 (и, v). Следователь- но, вершины и, v принадлежат разным компонентам связности. Положим Gj — компонента связности для и, a G2 — все остальное. Имеем G = Gi U G2. □ ЗАМЕЧАНИЕ-------------------------------------------------------- Таким образом, несвязный граф можно всегда представить как объединение связных ком- понент. Эти компоненты можно рассматривать независимо. Поэтому во многих случаях можно без ограничения общности предполагать, что рассматриваемый граф связен. 8.1.2. Точки сочленения Вершина графа называется точкой сочленения, если ее удаление увеличивает чи- сло компонент связности. ЛЕММА В любом нетривиальном графе есть (по крайней мере) две вершины, которые не являются точками сочленения. Доказательство Например, это концы диаметра. □ 8.1.3. Оценка числа ребер через число вершин и число компонент связности Инварианты p(G), g(G) и fc(G) не являются независимыми. ТЕОРЕМА Пусть р — число вершин, q — число ребер, к — число компонент связ- ности графа. Тогда „ (р — fc)(p — *-4-1) ---------j-------- Доказательство 1. р — к < q. Индукция по р. База: р = 1, q = 0, к — 1. Пусть оценка верна для всех графов с числом вершин меньше р. Рассмотрим граф G, p(G) = р. Удалим в G вершину v, которая не является точкой сочленения: G': = G — v. Тогда если v — изолированная вершина, то р' = р — 1, к' = к — 1, q' = q. Имеем р — к = р' — к' q' = q. Если v — не изолированная вершина, то р' — Р ~ к' = к, q' < q. Имеем: р — к = 1 + р? — к' 1 + q' q. 2. q < (р—fc)(p—fc+l)/2. Метод выделения «критических» графов. Число ребер q графа с р вершинами и к компонентами связности не превосходит числа ребер в графе с р вершинами и к компонентами связности, в котором все компонен- ты связности суть полные графы. Следовательно, достаточно рассматривать
212 Глава 8. Связность только графы, в которых все компоненты связности Полные. Среди всех гра- фов с р вершинами и к полными компонентами связности наибольшее число ребер имеет граф fc-i J<p_fc+i U [J Ki. 4=1 Действительно, пусть есть две компоненты связности Gi и Gz, такие что 1 < pi = p(Gi) < pz = p(Gz). Если перенести одну вершину из компонен- ты связности Gi в компоненту связности Gz-, то число ребер изменится на Дд = pz — (Pi — 1) = Pz — Pi + 1 > 0. Следовательно, число ребер возросло. Таким образом, достаточно рассмотреть случай fc-i Kp-k+i U (J Ki. г=1 Но при этом fc-1 q(Kp-k+iU |jK1) = (p-k+l)(p-fc + l-l)/2+0 = (p-k)(p-Hl)/2. □ i=l СЛЕДСТВИЕ Если q > (р — 1)(р — 2)/2, то граф связен. Доказательство Рассмотрим неравенство (р-1)(р-2)/2 < q (p-fc)(p-fc + l)/2 при различных значениях к. к = 1 (р - 1)(р - 2)/2 < (р - 1)р/2 выполняется, к = 2 (р - 1)(р - 2)/2 < (р - 2)(р - 1)/2 не выполняется, fc = 3 (р — 1)(р — 2)/2 < (р — 3)(р — 2)/2 не выполняется и т. д. □ 8.2. Вершинная и реберная связность При взгляде на диаграммы связных графов (сравните, например, рис. 7.9 и 8.1) возникает естественное впечатление, что связный граф может быть «более» или «менее» связен. В этом разделе рассматриваются некоторые количественные ме- ры связности. 8.2.1. Мосты и блоки Мостом называется ребро, удаление которого увеличивает число компонент связ- ности. Блоком называется связный граф, не имеющий точек сочленения. Пример В графе, диаграмма которого представлена на рис. 8.1:
8.2., Вершинная и реберная связность 213 1. вершины u, v .’г,, точки сочленения, и других точек сочленения нет; 2. рёбро ж1— моет, и других мостов нет; 3. правильные подграфы {а, Ь, и}, {а, и, w}, {a,b,u,w}, {c,d,v}, {e,f,y} — блоки, и других блоков нет. Рис. 8.1. Точки сочленения, мосты и блоки Если в графе, отличном от Ki, есть мост, то есть и точка сочленения. Концы всякого моста (кроме висячих вершин) являются точками сочленения, но не всякая точка сочленения является концом моста. ТЕОРЕМА Пусть G(V, Е) — связный граф uv eV. Тогда следующие утверждения эквивалентны: 1. v — точка сочленения; 2. 3 и, w Е V и / w & V {и, w)G v G {и, w); 3. 3(7, W UOW = 0&UUW = V\{v}8rtu&UVw eWV{u,w)G v e {u,w)G. Доказательство 1=>3: Рассмотрим G — v. Этот граф не связен, k(G — v) > 1, следовательно, G—v имеет (по крайней мере) две компоненты связности, то есть V\{v} = Ue)W, где U — множество вершин одной из компонент связности, a W — все остальные вершины Пусть и е U, w е W. Тогда -,3 (и, w)G_v. Но fc(G) = 1, следовательно, 3(u, w)G , и значит, V (и, w)G v е {u,w)G. 3=5-2: Тривиально. 2=$>1: Рассмотрим G — v. Имеем: ->3 {и, w)G_v. Следовательно, fc(G - v) > 1, откуда v — точка сочленения. О ТЕОРЕМА Пусть G(V,E) — связный граф и х е Е. Тогда следующие утвержде- ния эквивалентны: 1. х — мост; 2. х не принадлежит ни одному простому циклу;
214 Глава 8. Связность 3. В и, w е V V (и, w)G х G {и, w)G; 4. 3C7,VKC/nWz = 0&t7UWz = V&Vu€t7VwG WV(u,w)Gx& {u,w)G. Доказательство Упражнение 8.2. 8.2.2. Меры связности Вершинной связностью графа G (обозначается x(G)) называется наименьшее чи- сло вершин, удаление которых приводит к несвязному или тривиальному графу. Пример x(G) = 0, если G несвязен; x(G) = 1, если G имеет точку сочленения; х(Кр) = р — 1, если Кр — полный граф. Граф G называется k-связным, если x(G) = к. Реберной связностью графа G (обозначается A(G)) называется наименьшее число ребер, удаление которых приводит к несвязному или тривиальному графу. Пример A(G) = 0, если G несвязен; A(G) = 1, если G имеет мост; А(2Гр) = р - 1, если Кр — полный граф. ТЕОРЕМА x(G) < A(G) < 4(G). Доказательство х А: Если А = 0, то х = 0. Если А = 1, то есть мост, а значит либо есть точка сочленения, либо G = К-2- В любом случае х = 1. Пусть теперь А > 2. Тогда удалив А — 1 ребро, получим граф G', имеющий мост (u, v). Для каждого из удаляемых А — 1 ребер удалим инцидентную вершину, отличную от и и V. Если после такого удаления вершин граф несвязен, то х А — 1 < А. Если связен, то удалим один из концов моста — и или V. Имеем х А. А < 5: Если 6 = 0, то А = 0. Пусть вершина v имеет наименьшую степень: d(y) = <5. Удалим все ребра, инцидентные v. Тогда А < <5. □ 8.3. Теорема Менгера Интуитивно очевидно, что граф тем более связен, чем больше существует раз- личных цепей, соединяющих одну вершину с другой, и тем менее связен, чем
8.3. Теорема Менгера 215 меньше нужно удалить промежуточных вершин, чтобы отделить одну вершину от другой. В этом разделе устанавливается теорема Менгера, которая придает этим неформальным наблюдениям точный и строгий смысл. 8.3.1. Непересекающиеся цепи и разделяющие множества Пусть G(V, Е) — связный граф, и и v — две его несмежные вершины. Две цепи (и, v) называются вершинно-непересекающимися, если у них нет общих вершин, отличных от и и V. Две цепи {и, v) называются реберно-непересекающимися, если у них нет общих ребер. Если две цепи вершинно не пересекаются, то они и реберно не пересекаются. Множество вершинно-непересекающихся цепей (м,и) обозначим через P(u,v). P(u,v) : = {(u, v) | (и, v)Y e P& {u, v)2 e P =$ (u, v)r П {u,v)2 = {u, u}} . Множество S вершин (и/или ребер) графа G разделяет две вершины и и v, если и и v принадлежат разным компонентам связности графа G — S. Разделяющее множество ребер называется разрезом. Разделяющее множество вершин для вер- шин и и v обозначим S(u, v). S(u,v): = {weV\G-S = GiGG2,v&Gi,u&G2}. ЗАМЕЧАНИЕ------------------------------------------------------ Если и Vi v принадлежат разным компонентам связности графа G, то |P(u, г»)| = О .и |S(u, п)| = 0. Поэтому без ограничения общности можно считать, что G — связный граф. 8.3.2. Теорема Менгера в «вершинной форме» ТЕОРЕМА (Менгера) Пусть и и v — несмежные вершины в графе G. Наимень- шее число вершин в множестве, разделяющем и и v, равно наибольшему числу вершинно-непересекающихся простых (и,v)-цепей: max|P(u, v)| = min|S(u, и)|. ЗАМЕЧАНИЕ---------------------------------------------------------- Пусть G — связный граф, и вершины и и v несмежны. Легко видеть, что |Р| |S|. Действи- тельно, любая (и, г)-цепь проходит через S. Если бы |Р| > |S|, то в S была бы вершина, принадлежащая более чем одной цепи из Р, что противоречит выбору Р. Таким образом, VP VS |Р| |S|. Следовательно, max|Р| min |S|. Утверждение теоремы состоит в том, что в любом графе существуют такие Р и S, что достигается равенство |Р| = |S|. Доказательство Пусть G — связный граф, и и v — несмежные вершины. Совместная индукция по р и q. База: наименьший граф, удовлетворяющий условиям теоремы, состоит
216 Глава 8. Связность ИЗ трех вершин и, w,v и двух ребер (u,w) и (w, v). В нем Р(и, v) = ,(u,w,v) и S(u,v) = {w}. Таким образом, |P(u, v)| == ^(u, u)| = 1. Пусть утверждение теоремы верно для всех графов с числом вершин меньше р и/или числом ребер меньше q. Рассмотрим граф G с р вершинами и д ребрами. Пусть и, v G V, и, v — не смежны и S — некоторое наименьшее множество вершин, разделяющее и и v, п: = |S|. Рассмотрим три случая. 1. Пусть в S есть вершины, несмежные с и и несмежные с v. Тогда граф G — S со- стоит из двух нетривиальных графов Gi и G2. Образуем два новых графа Gu и Gv, стягивая нетривиальные графы Gi и G2 к вершинам и и v, соответственно: Gu : = G/Glt Gv : = G/G2 (рис. 8.2). Рис. 8.2. Доказательство теоремы Менгера, случай 1 S по-прежнему является наименьшим разделяющим множеством для и и v как в Gu, так и в Gv. Так как Gr и G2 нетривиальны, то Gu и Gv имеют мень- ше вершин и/или ребер, чем G. Следовательно, по индукционному предполо- жению в Gu и в Gv имеется п вершинно-непересекающихся простых цепей. Комбинируя отрезки этих цепей от S до v и от и до S, получаем п вершинно- непересекающихся простых цепей в G. 2. Пусть все вершины S смежны с и или с v (для определенности пусть с и), и среди вершин S есть вершина w, смежная одновременно с и и с v (рис; 8.3). Рис. 8.3. Доказательство теоремы Менгера, случай 2 Рассмотрим граф G': = G - w. В нем S \ {w} — разделяющее множество для и и v, причем наименьшее. По индукционному предположению в G' имеется |S\ {w}| = п — 1 вершинно-непересекающихся простых цепей. Добавим к ним цепь (и, w, v). Она простая и вершинно не пересекается с остальными. Таким образом, имеем п вершинно-непересекающихся простых цепей в G.
8.3. Теорема Менгера 217 3. Пусть теперь все вершины S смежны с и или с v (для определенности пусть с и), и среди вершин S нет вершин, смежных одновременно с вершиной и и с вершиной V. Рассмотрим кратчайшую (w, г/)-цепь {и, Wi,W2, • • • ,v), wr g S, u>2 / v (рис. 8.4). Рис. 8.4. Доказательство теоремы Менгера, случай 3 Рассмотрим граф G': = G/{wi,w2}, полученный из G склейкой вершин w\ и W2 в вершину wi. Имеем w2 0 8, в противном случае цепь (и,ги2,..., v) была бы еще более короткой. Следовательно, в графе G' множество S по- прежнему является наименьшим, разделяющим и и v, и граф G' имеет (по крайней мере) на одно ребро меньше. По индукционному предположению в G’ существуют п вершинно-непересекающихся простых цепей. Но цепи, которые не пересекаются в G', не пересекаются и в G. Таким образом, имеем п вершино- непересекающихся простых цепей в G. □ 8.3.3. Варианты теоремы Менгера Теорема Менгера представляет собой весьма общий факт, который в разных фор- мулировках встречается в различных областях математики. Комбинируя вер- шинно- и реберно-непересекающиеся цепи, разделяя не отдельные вершины, а множества вершин, используя инварианты х и А, можно получить множество результатов «типа теоремы Менгера». Например: ТЕОРЕМА Для любых двух несмежных вершин и и v графа G наибольшее число реберно-непересекающихся (и, v)-цепей равно наименьшему числу ребер в (u,v)- разрезе. ТЕОРЕМА Чтобы граф G был k-связным, необходимо и достаточно, чтобы лю- бые две несмежные вершины были соединены не менее чем к вершинно-непересе- кающимися простыми цепями. Другими словами, в любом графе G любые две несмежные вершины соединены не менее чем x(G) вершинно-непересекающимися простыми цепями.
218 Глава 8. Связность 8.4. Теорема Холла Теорема Холла, устанавливаемая в этом разделе, имеет множество различных применений и интерпретаций, с рассмотрения которых мы и начинаем ее изло- жение. 8.4.1. Задача о свадьбах Пусть имеется конечное множество юношей, каждый из которых знаком с неко- торым подмножеством множества девушек. В каком случае всех юношей можно женить так, чтобы каждый женился на знакомой девушке? 8.4.2. Трансверсаль Пусть S — {Si,..., Sm} — семейство подмножеств конечного множества Е. Sk не обязательно различны и могут пересекаться. Системой различных предста- вителей S (или трансверсалью S) называется подмножество С = {сг,... ,сгп} из т элементов множества Е, таких что с*, € Sk. В каком случае существует трансверсаль? ЗАМЕЧАНИЕ----------------------------------------------------- С является множеством, а потому все элементы С различны, откуда и происходит назва- ние «система различных представителей». 8.4.3. Совершенное паросочетание Паросочетанием (илй независимым множеством ребер) называется множество ребер, в котором никакие два не смежны. Независимое множество называется максимальным, если никакое его надмножество не является независимым. Пусть G(Vi, V2,E) — двудольный граф. Совершенным паросочетанием из Vx в V2 называется паросочетание, покрывающее вершины Ц. В каком случае существу- ет совершенное паросочетание из Ц в V2? ЗАМЕЧАНИЕ------------------------------------------------------ Совершенное паросочетание является максимальным. 8.4.4. Теорема Холла — формулировка и доказательство Вообще говоря, задачи 8.4.1, 8.4.2 и 8.4.3 — это одна и та же задача. Действитель- но, задача 8.4.1 сводится к задаче 8.4.3 следующим образом. Ц — множество юно- шей, V2 — множество девушек, ребра — знакомства юношей с девушками. В таком случае совершенное паросочетание — искомый набор свадеб. Задача 8.4.2 сводит- ся к задаче 8.4.3 следующим образом. Положим Ух : = S, V2: = E, ребро (Sk,ei) существует, если а 6 Sk. В таком случае совершенное паросочетание — искомая
8.4. Теорема Холла 219 трансверсаль. Таким образом, задачи 8.4.1, 8.4.2 и 8.4.3 имеют общий ответ: в том и только том случае, когда (юношей \ / знакомы с \ подмножеств I в совокупности I содержат I вершин из Ц у у смежны с у (девушками \ элементов , вершинами из 14 / что устанавливается следующей теоремой. ТЕОРЕМА (Холла) Пусть G{Vi, 14, Е) — двудольный граф. Совершенное паросо- четание из Ц в 14 существует тогда и только тогда, когда У А С 14 |А| < |Г(А)| Доказательство Необходимость. Пусть существует совершенное паросочетание из Ц в 14. Тогда в Г(А) входит |А| вершин из 14 парных к вершинам из А и, возможно, еще что-то. Таким образом, |А| < |Г(А)|. Достаточность. Добавим в G две новые вершины и и v, так что и смежна со всеми вершинами из Ц, a v смежна со всеми вершинами из V2. Совершенное паросочетание из Ц в 14 существует тогда и только тогда, когда существуют Щ| вершинно-непересекающихся простых (и, v) цепей (рис. 8.5). Ясно, что |P(u, v)| < < Щ| (так как 14 разделяет и и v). Рис. 8.5. Иллюстрация к доказательству теоремы Холла По теореме Менгера max|P(u, v)| = min |.!?(и,ц)| = |S|, где S — наименьшее мно- жество, разделяющее вершины и и v. Имеем IS) < [141. Покажем, что [S’! > |Vj|. Пусть S = A U В, А С Vi, В С И2. Тогда Г(14 \ А) с В. Действительно, если
220 Глава 8. Связность бы Г(Ц \ 4) £ В, то существовал бы «обходной» путь и S' не было бы разделяющим множеством для и и v. Имеем: Щ \ А| |Г(Ц \ А)| < |В|. Следовательно, |S] = |А| + |В| |А| + |Vj \ А| = |У!|. 6 8.5. Потоки в сетях Рассмотрим некоторые примеры практических задач. Пример 1. Пусть имеется сеть автомобильных дорог, по которым можно проехать из пункта А в пункт В. Дороги могут пересекаться в промежуточных пунктах. Количество автомобилей, которые могут проехать по каждому отрезку дороги в единицу времени, не безгранично, оно определяется такими факторами, как ширина проезжей части, качество дорожного покрытия, действующие ограни- чения скорости движения и т. д. (обычно это называют «пропускной способно- стью» дороги). Каково максимальное количество автомобилей, которые могут проехать из пункта А в пункт В без образования пробок на дорогах (обычно это называют «автомобильным потоком»)? Или же можно поставить другой вопрос: какие дороги и насколько нужно расширить или улучшить, чтобы уве- личить максимальный автомобильный поток на заданную величину? 2. Пусть имеется сеть трубопроводов, соединяющих пункт А (скажем, нефтепро- мысел) с пунктом В (скажем, нефтеперерабатывающим заводом). Трубопрово- ды могут соединяться и разветвляться в промежуточных пунктах. Количество нефти, которое может быть перекачено по каждому отрезку трубопровода в единицу времени, также не безгранично и определяется такими факторами, как диаметр трубы, мощность нагнетающего насоса и т. д. (обычно это назы- вают «пропускной способностью» или «максимальным расходом» трубопро- вода). Сколько нефти можно прокачать через такую сеть в единицу времени? 3. Пусть имеется система машин для производства готовых изделий из сырья, и последовательность технологических операций может быть различной (то есть операции могут выполняться на разном оборудовании или в разной последо- вательности), но все допустимые варианты заранее строго определены. Мак- симальная производительность каждой единицы оборудования, естественно, также заранее известна и постоянна. Какова максимально возможная произ- водительность всей системы в целом и как нужно организовать производство для достижения максимальной производительности? Изучение этих и многочисленных подооных им практических задач приводит к теории потоков в сетях. В данном разделе рассматривается решение только од- ной (но самой существенной) задачи этой теории, а именно задачи определения максимального потока. Описание других родственных задач, например задачи определения критического пути, можно найти в литературе, упомянутой в конце главы.
8.5. Потоки в сетях 221 8.5.1. Определение потока Пусть G(V,E) — сеть, s и t — соответственно источник и сток сети. Дуги сети нагружены неотрицательными вещественными числами, с: Е -> Ж+. Если и и v — вершины, то число c(u, v) — называется пропускной способностью дуги (и, v). ЗАМЕЧАНИЕ —-------------------------------------------------- Матрица пропускных способностей С : array [l..p, l..p] of real является представлением сети, аналогичным матрице смежности. Элемент С [и, и] = О соответствует дуге с нулевой пропускной способностью, то есть отсутствию дуги, а элемент С [и, о] > 0 соответствует дуге с ненулевой пропускной способностью, то есть дуга присутствует. Пусть задана функция f: Е -> Ж. Дивергенцией функции f в вершине v называ- ется число div(/, ц), которое определяется следующим образом: div(/,u): = Жы)- {«|(u,v)€E} {v|(v,u)€E} ЗАМЕЧАНИЕ----------------------------------------------------------------- В физике дивергенция обычно определяется наоборот: то, что пришло, минус то, что ушло. Но в данном случае удобнее, чтобы дивергенция источника была положительна. Функция f: Е -> R называется потоком в сети G, если: 1. V(u, v) G Е 0 < f(u,v) < с(и, v), то есть поток через дугу неотрицателен и не превосходит пропускной способности дуги; 2. Vu е V\{s,t} div(/,и) = 0, то есть дивергенция потока равна нулю во всех вершинах, кроме источника и стока. Число w(f): = div(/, s) называется величиной потока /. 8.5.2. Разрезы Пусть Р — (s,t)-разрез, Р С Е. Всякий разрез определяется разбиением множе- ства вершин V на два подмножества S и Т, так что S с V, Т с V,- S U Т = V, S С\Т = 0, s е S, t е Т, а в Р попадают все дуги, соединяющие S и Т. Тогда Р — Р+ U Р~, где Р+ — дуги от S к Т, Р~ — дуги от Т к S. Сумма потоков через дуги разреза Р обозначается F(P). Сумма пропускных способностей дуг разреза Р называется пропускной способностью разреза и обозначается С'(Р): Г(Р): = £/(е), О(Р): = ]ГС(е). ееР ёеР
222 Глава 8. Связность 8.5.3. Теорема Форда и Фалкерсона ЛЕММА w(/) = F(P+) - F(P~). Доказательство Рассмотрим сумму W: = 52 div(/, v). Пусть дуга (u,v) G Е. Если и, v G S, то v£S в сумму W попадают два слагаемых для этой дуги: +f(u, v) при вычислении div(/,u) и — f(u, v) при вычислении div(/,v), итого 0. Если и G S, v G Т, то в сумму W попадает одно слагаемое +f(u, v), все такие слагаемые дают F(P+). Если и G Т, v G S, то в сумму W попадает одно слагаемое — f(u, v), все такие слагаемые дают F(P~). Таким образом, W = F(P+) — F(P“). С другой стороны, W = 52 div(/,v) — div(f,s) — w(/). □ ЛЕММА div(/, s') = — div(/,t). Доказательство Рассмотрим разрез P: =(S, T), где S: = V \ {t}, a T: ={t}. Имеем: div(/,s) = w(/) = F(P+) - F(P-) = F(P+) = = -div(/,t). □ ЛЕММА w(/) < F(P). Доказательство w(/) = F(P+) - F(P-) < F(P+) < F(P). □ ЛЕММА maxw(f) < minC'(P). Доказательство По предыдущей лемме w(/) < F(P), следовательно, maxw(/) < min F(P). f p По определению F(P) < C(F), следовательно, min F(P) minC'(P). p p Имеем: maxw(f) minC'(P). □ ТЕОРЕМА (Форда и Фалкерсона) Максимальный поток в сети равен минималь- ной пропускной способности разреза, то есть существует поток f*, такой что w(/*) = max w(/) = пйп С(Р).
8.5. Потоки в сетях 223 Доказательство Пусть f — некоторый максимальный поток. Покажем, что существует разрез Р, такой что w(J) = С(Р). Рассмотрим граф G', полученный из сети G отменой ориентации ребер. Построим множество вершин S следующим образом: S:={u е V | 3 {s,u) е G' €. G' G E —..-J* <Z C(Ui,Ui+i) & (^4-1, Zlj) £ E r f (rti-j-l, *Нг) > 0}? то есть вдоль пути (s, и) дуги в направлении путй не насыщены, а дуги против направления пути имеют положительный поток. Такая цепь {s, и) называется аугменталъной. Имеем s G S по построению. Следовательно, S / 0. Положим Т: = V \ S. Покажем, что t е Т. Действительно, пусть t G S. Тогда существует аугментальная цепь обозначим ее й. Но тогда можно найти число 6: {с(е) - f(e) > 0, если е ориентировано вдоль R. /(е) > 0, если е ориентировано против R. В этом случае можно увеличить величину потока на 6, изменив поток для всех дуг аргументальной цепи: ) Ле) + если е ориентировано вдоль R, /(е) — 6, если е ориентировано против R. При этом условия потока выполняются: 0 < /(е) < (7(e), div(v) = 0. Таким образом, поток f увеличен на величину 6, что противоречит максималь- ности потока /. Имеем t G Т и Т / 0. Следовательно, S и Т определяют разрез Р = Р+ U Р~. В этом разрезе все дуги е+ насыщены (/(е+) = <7(е+)), а все дуги е~ не нагружены (/(е-) = 0), иначе S можно было бы расширить. Имеем: w(/) = Р(Р+) — Р(Р_) = (7(Р+), таким образом, Р+ — искомый разрез. □ 8.5.4. Алгоритм нахождения максимального потока Следующий алгоритм определяет максимальный поток в сети, заданной матри- цей пропускных способностей дуг. Этот алгоритм использует ту же идею доказа- тельства теоремы Форда и Фалкерсона, а именно, задавшись начальным прибли- жением потока, определяется множество вершин S, которые соединены аугмен- тальными цепями с источником s. Если оказывается, что t G S, то это означает, что поток не максимальный и его можно увеличить на величину 6. Для опреде- ления аугментальных цепей и одновременного подсчета величины 6 в алгоритме использована вспомогательная структура данных: Р : array [l..p] of record s : enum (—, +) { «знак», то есть направление дуги } п : 1..р { предшествующая вершина в аугментальной цепи } 8 : real { величина возможного увеличения потока } end record
224 Глава 8. Связность Алгоритм 8.1. Нахождение максимального потока Вход: сеть G(V,E) с источником s и стоком t, заданная матрица пропускных способно- стей С : array [l..p, l..p] of real. Выход: матрица максимального потока F : array [l..p, l..p] pf real. for и, v е V do F[u, и]: = 0{ вначале поток нулевой } end for M : { итерация увеличения потока } for v 6 V do S[v]: = 0; : = 0; P[v] :=(,,) { инициализация } end for S[s]: = 1; P[s]: =(+, s, oo){ так как s G S } repeat a: = 0{ признак расширения S } for v e V do if = 1 & 7V[u] = 0 then for u g Г(г>) do if S^u] = 0 & F[u, u] < C[i>, u] then Sfu]: — 1; P[u]: =(+, v, min(P[i>].5, C[u, u] — F[u, u])); a: = 1 end if end for for и £ Г-1(ц) do if Sfu] = 0 & F[u, o] > 0 then sju]: = 1; P[u]: =(—, v, min(P[v].5, F[u, u])); a: = 1 end if end for JVM: = 1 end if end for if S[t] then x : = t; 5: = P[t] .5 while x / s do if P[o:j.s = + then F[P[o:].n, a:]: = F[P[o:].n, + 6 else F[a:, P[o:].n]: = F[rr, Ppr].n] — 6 end if x: =P[o:].n end while goto M end if until a = 0 Обоснование В качестве первого приближения берется нулевой поток, который по определе- нию является допустимым. В основном цикле, помеченном меткой М, делает- ся попытка увеличить поток. Для этого в цикле repeat расширяется, пока это возможно, множество S вершин, достижимых из вершины s по аугментальным
8.5. Потоки в сетях 225 цепям. При этом, если в множество S попадает вершина t, то поток вдоль най- денной аугментальной цепи (s,t) немедленно увеличивается на величину 6, и начинается новая итерация с целью увеличить поток. Процесс расширения мно- жества S в цикле repeat заканчивается, потому что множество вершин конечно, а отмеченные в массиве N вершины повторно не рассматриваются. Если про- цесс расширения множества S заканчивается и при этом вершина t не попадает в множество S, то по теореме Форда и Фалкерсона найденный поток F является максимальным и работа алгоритма завершается. □ ЗАМЕЧАНИЕ---------------------------------------------------------- Приведенный алгоритм не является самым эффективным. Более подробное изложение известных методов можно найти, например, в [14] или в [И]. 8.5.5. Связь между теоремой Менгера и теоремой Форда и Фалкерсона Теорема Менгера является фундаментальным результатом, который проявляется в различных формах (см., например, задачи 8.4.1, 8.4.2, 8.4.3). Теорема Форда и Фалкерсона также может быть получена из теоремы Менгера. Далее приведена схема неконструктивного доказательства теоремы Форда и Фалкерсона на основе теоремы Менгера. Сначала нужно получить вариант теоремы Менгера в ориен- тированной реберной форме: наибольшее число (s, i)-путей, непересекающихся по дугам, равно наименьшему числу дуг в ($, £)-разрезе. Это теорема Форда и Фалкерсона в том случае, когда Ve € Е С{е) = 1. Действительно, пусть Q — множество дуг из максимального набора непересекающихся (s,t)-путей. Назна- чим /(е): = 1, если е е Q, и /(е): = 0, если е Q. Это поток, так как дивергенция в любой вершине равна 0 и поток через дугу не превосходит пропускной способ- ности. Величина этого потока равна к < d+(s), где к — число дуг, выходящих из з, которые начинают пути из Q. Этот поток максимальный. Действительно, если положить /(е): = а > 0 для е 0 Q, то 1. если дуга е входит в вершину, входящую в пути из Q, или выходит из такой вершины, то нарушается условие потока (дивергенция —а или +а, соответ- ственно); 2. если вновь назначенные дуги с ненулевыми потоками образуют новый путь, то это противоречит выбору Q. Пусть теперь пропускные способности суть натуральные числа. Тогда можно про- вести аналогичные рассуждения для мультиграфов, считая, что вместо одной ду- ги с пропускной способностью п имеется п дуг с пропускной способностью 1. Если пропускные способности — рациональные числа, то их можно привести к общему знаменателю и свести задачу к предыдущему случаю. Для вещественных пропускных способностей заключение теоремы можно полу- чить путем перехода к пределу в условиях предыдущего случая.
226 Глава 8. Связность ОТСТУПЛЕНИЕ--------- ---------------------—-------------------- Приведенное в разделе 8.5.3 доказательство Теоремы Форда и Фалкерсона конструктивно, из него не только следует заключение о величине максимального потока, но и извлекается способ нахождения максимального потока. 8.6. Связность в орграфах Связность является одним из немногих понятий, которые не распространяются непосредственно с графов на другие родственные объекты и требуют отдельного определения и рассмотрения. 8.6.1. Сильная, односторонняя и слабая связность В неориентированном графе две вершины либо связаны (если существует со- единяющая их цепь), либо не связаны. В ориентированном графе отношение связанности вершин несимметрично, а потому определение связности отличает- ся. Пусть G(V, Е) орграф, Vi и v2 — его вершины. Говорят, что две вершины щ и v2 сильно связаны в орграфе G, если существует путь (ориентированная цепь) из i'i в «г и из v2 в Vi. Говорят, что две вершины vi и v2 односторонне связаны в орграфе G, если существует путь либо из Vi в v2, либо из v2 в Говорят, что две вершины щ и v2 слабо связаны в орграфе G, если они связаны в графе G', полученном из G отменой ориентации ребер. Если все вершины в орграфе силь- но (односторонне, слабо) связаны, то орграф называется сильно (односторонне, слабо) связным. Сильная связность влечет одностороннюю связность, которая Влечет слабую связность. Обратное неверно. Пример На рис. 8.6 показаны диаграммы сильно, односторонне и слабо связных орграфов. Рис. 8.6. Сильная (слева), односторонняя (в центре) и слабая (справа) связность 8.6.2. Компоненты сильной связности Компоненты сильной связности (КСС) орграфа G — это его максимальные сильно связные подграфы.
8.6. Связность в орграфах 227 Каждая вершина орграфа принадлежит только одной КСС. Если вершина не связана с другими, то считаем, что она сама образует КСС. Конденсацией G* орграфа G (или графом Герца, или фактор-графом') называется орграф, который получается стягиванием в одну вершину каждой КСС орграфа G. Пример На рис. 8.7 показаны диаграммы орграфа и его конденсации. Рис. 8.7. Оргаф (слева) и его фактор-граф (справа) 8.6.3. Выделение компонент сильной связности Следующий алгоритм, основанный на методе поиска в глубину, находит все ком- поненты сильной связности орграфа. Алгоритм 8.2. Выделение компонент сильной связности Вход: орграф G(V, Е), заданный списками смежности Г(г>). Выход: список С компонент сильной связности, каждый элемент которого есть список вершин, входящих в компоненту сильной связности. С: = 0 fот v eV do M[v]: ={v} { М[г>] список вершин, входящих в ту же КСС, что и v } е[г>]: = 0 { все вершины не рассмотрены } end for while V / 0 do select v eV { взять v из V } T <— v { положить v в стек } е[г>]: = 1 { отметить v } КСС { вызов процедуры КСС } end while Основная работа выполняется рекурсивной процедурой без параметров КСС, которая использует стек Т для хранения просматриваемых вершин. Процедура КСС выделяет все КСС, достижимые из вершины, выбранной в основном алго- ритме. if Т = 0 then return{ негде выделять }
228 Глава 8. Связность end if v 4- Т; v —> Т { стоим в вершине г>} if Г[г>] Г) V = 0 then О.=СиЛф] {это КСС} V: = V \ {«} { удалить вершину } v <— Т { снять v со стека } КСС { возврат из тупика } else for и G Г[п] do if e[u] = 0 then и —> Т { положить и в стек } е[и]: = 1 { отметить и } else repeat w <— Т { w — склеиваемая вершина } V: = V \ {w} { удалить ее } Г[и]: = Г[и] U Г[ад] { запомнить смежность } М[u]: = М[и] U M[w]{ склеивание вершин } until u — w w —> Т{ чтобы не убрать ту Вершину, } V: = V U {ш}{ к которой слили } end if КСС { поиск в глубину } end for end if 8.7. Кратчайшие пути Задача нахождения кратчайшего пути в графе имеет столько практических при- менений и интерпретаций, что читатель, без сомнения, может сам легко привести множество примеров. Здесь рассматриваются два классических алгоритма, кото- рые обязан знать каждый программист. 8.7.1. Длина дуг Алгоритм Уоршалла позволяет ответить на вопрос, существует ли цепь (и, и). Часто нужно не только определить, существует ли цепь, но и найти эту цепь. Если задан орграф G(V, Е), в котором дуги помечены числами (эти числа обычно называют весами, или длинами, дуг), то этот орграф можно представить в виде матрицы весов (длин) С: C[i,j] = ДЛЯ г = j конечная величина, если есть дуга из i в j, если нет дуги из i в j. Длиной пути называется сумма длин дуг, входящих в этот путь. Наиболее часто на практике встречается задача отыскания кратчайшего пути.
8.7. Кратчайшие пути 229 8.7.2. Алгоритм Флойда Алгоритм Флойда находит кратчайшие пути между всеми парами вершин в (ор)графе. В этом алгоритме для хранения информации о путях используется матрица Я[1..р, 1..р], где {к, если к — первая вершина, достигаемая на кратчайшем пути из г в j; О, если из 1 в j нет пути. ОТСТУПЛЕНИЕ---------------------------------------------------------- Матрица Н размера О(р2) хранит информацию обо всех (кратчайших) путях в графе. Заметим, что всего в графе О(р2) путей, состоящих из О(р) вершин. Таким образом, не- посредственное представление всех путей потребовало бы памяти объема О(р3). Эконо- мия памяти достигается за счет интерпретации представления, то есть динамического вычисления некоторой части информации вместо ее хранения в памяти. В данном слу- чае любой конкретный путь {и, и) легко извлекается из матрицы с помощью следующего алгоритма. w: = и; yield w{ первая вершина } while w / v do w: = Я[ш, v]; yield w{ следующая вершина } end while Алгоритм 8.3. алгоритм Флойда Вход: матрица Cfl.-p, 1..р] длин дуг. Выход: матрица Т[1..р, 1..р] длин путей и матрица Я[1..р, 1..р] самих путей, for i from 1 to р do for j from 1 to p do T[i, j] :==C[»,j] { инициализация } if C[i,)} = oo then Я[г,>] : = 0 { нет дуги из i В j } else H[i, j]: =j { есть дуга из i в j } end if end for end for for i from 1 to p do for j from 1 to p do for к from 1 to p do if t / j & Ту, i] / oo & t / k & T[i, fc] / oo &(T[f, fc] = oo XfT[j, k] > ТЦ, i] +T[i, fc]) then H\j, fc]: = Яу,г] { запомнить новый путь } T\j, fc]: = ТУ, г] + Т[г, fc] { и его длину } end if end for end for for j from 1 to p do if Ty,j] < 0 then
230 Глава 8. Связность stop { нет решения: вершина j входит в цикл отрицательной длины } end if end for end for ЗАМЕЧАНИЕ-----------------------------------------------------•--------- Если в G есть цикл с отрицательным весом, то решения поставленной задачи не суще- ствует, так как можно «накручивать»; на этом цикле сколь угодно короткий путь. Обоснование Алгоритм Флойда имеет много общего с алгоритмом Уоршалла (алгоритм 1.8). Покажем по индукции, что после выполнения г-го шага основного цикла пр г элементы матриц T[j, fc] и Н[у, к] содержат, соответственно, длину кратчайшего пути и первую вершину на кратчайшем пути из вершины j в вершину к, про- ходящем через промежуточные вершины из диапазона 1..г. База: г = 0, то есть до начала цикла элементы матриц Т и Н содержат информацию-о кратчайших путях (если таковые есть), не проходящих ни через какие промежуточные вер- шины. Пусть теперь перед началом выполнения тела цикла на г-м шаге к] содержит длину кратчайшего пути от j к к , а Я{у, fc] содержит первую вершину на кратчайшем пути из вершины j в вершину к (если таковой есть). В таком случае, если в результате добавления вершины г к диапазону промежуточных вершин находится более короткий путь (в частности, если это вообще первый найденный путь), то он записывается. Таким образом, после окончания цикла, когда г = р, матрицы содержат кратчайшие пути, проходящие через промежуточ- ные вершины 1..р, то есть искомые кратчайшие пути. Алгоритм не всегда выдает решение, поскольку оно не всегда существует. Дополнительный цикл по j служит для прекращения работы в случае обнаружения в графе цикла с отрицательным весом. □ 8.7.3. Алгоритм Дейкстры Алгоритм Дейкстры находит кратчайший путь между двумя данными вершинами в (ор)графе, если длины дуг неотрицательны. Алгоритм 8.4. алгоритм Дейкстры Вход: орграф G(V,E), заданный матрицей длин дуг С : array [l..p, l..p] of real; е й г.- вершины графа. Выход: векторы Т : array [l..p] of real; и Н : array [l..p] of О..р. Если вершина v лежит на кратчайшем пути от s к t, то Т[г>] — длина кратчайшего пути от s к v, Я[о] — вершина, непосредственно предшествующая v на кратчайшем пути. for v from 1 to р do T[i>]: = oo { кратчайший путь неизвестен } : = 0 { все вершины не отмечены } end for ЕГ[s]: — 0 { в ничего не предшествует } T[s]: = 0 { кратчайший путь имеет длину 0 ... }
8.7. Кратчайшие пути 231 X[s]: = 1 { ... и он известен } v: — в { текущая вершина } М: { обновление пометок } for иё Hv) do if X[u] = 0 & T[ti] > T[i>] + C[v, u] then T[u]: = T[i>] + C[v,u] { найден более короткий путь из з в и через v } Я [u]: = v { запоминаем его } end if end for t: = oo;i>: = 0 { поиск конца кратчайшего пути } for и from 1 to р do if X[u] = 0 & T[u] < t then v: = u; t: = T[u] { вершина v заканчивает кратчайший путь из S} end if end for if v = 0 then stop { нет пути из s в t} end if if v = t then stop { найден кратчайший путь из s в t} end if X[v]: = 1 { найден кратчайший путь из s в v} goto M ЗАМЕЧАНИЕ-------------------------------------------------------------------- Для применимости алгоритма Дейкстры достаточно выполнения более слабого условия, чем положительность длин дуг. А именно, достаточно выполнения неравенства треуголь- ника-. Vu,v,w G V d(u, v) С d(u, w) + d(w, v), которое, очевидно, выполняется, если длины дуг неотрицательны. Обоснование Для доказательства корректности алгоритма Дейкстры достаточно заметить, что при каждом выполнении тела цикла, начинающегося меткой М, в качестве и используется вершина, для которой известен кратчайший путь из вершины s. Другими словами, если X[v] = 1, то = d(s,v), и все вершины на пути (s,v), определяемом вектором Н, обладают тем же свойством, то есть Vu Г[и] = 1 =► T[u] = d(s, и) &Т[Я[и]] = 1. Действительно (по индукции), первый раз в качестве и используется вершина s, для которой кратчайший путь пустой и имеет длину 0 (непустые пути не мо- гут быть короче, потому что длины дуг неотрицательны). Пусть Т[п] = d(s, и) для всех ранее помеченных вершин и. Рассмотрим вновь помеченную верши- ну v, которая выбрана из условия Т[п] = min Tful. Заметим, что если известен Х[и]-0 1 J
232 Глава 8. Связность путь, проходящий через помеченные вершины, то тем самым известен кратчай- ший путь. Допустим (от противного), что T[v] >d(s,v), то есть найденный путь, ведущий из s в и, не является кратчайшим. Тогда на этом пути должны быть непомеченные вершины. Рассмотрим первую вершину w на этом пути, такую что T[w] = 0. Имеем: T[w] = d(syw) d(s,v) < T[v], что противоречит выбору вершины V. □ ЗАМЕЧАНИЕ------------------------------------------------------- Известно, что алгоритм Флойда примерно на 50% менее трудоемок, чем применение ал- горитма Дейкстры для всех пар вершин. Комментарии Изложение центрального результата этой главы — теоремы Менгера 8.3.2 и со- путствующего материала — в основном следует в [23]. Алгоритм нахождения максимального потока в сети заимствован из [11] с небольшими модификациями. Алгоритм выделения компонент сильной связности приведен в [5], где имеется весьма полный обзор различных алгоритмов обхода и анализа графов, применя- емых в программировании. Алгоритмы Флойда и Дейкстры нахождения крат- чайших путей принадлежит к числу классических общеизвестных алгоритмов, описание которых можно найти в большинстве учебников по дискретной мате- матике, в частности, в [14, И]. Упражнения 8.1. Доказать, что если <5(G) > (р — 1)/2, то граф G связен. 8.2. Доказать вторую теорему подраздела 8.2.1. 8.3. Доказать, что наибольшее число непересекающихся множеств вершин, раз- деляющих вершины и и v, равно d(u, и) — 1. 8.4. «Задача о гареме». Имеется конечное множество юношей, каждый из ко- торых знаком с некоторым конечным подмножеством множества девушек. Каждый юноша желает взять в жены более чем одну знакомую девушку. Най- ти необходимое и достаточное условия решения этой задачи. 8.5. Пусть в сети G(V, Е) помимо пропускной способности дуг заданы пропуск- ные способности узлов, то есть задана нагрузка на вершины D : V —> R+ Для допустимого потока сумма потоков через входящие дуги не должна пре- вышать пропускной способности вершины VveV ^2 /(u, v) G(v). {u|(u,v)eE} Найти максимальный поток в такой сети.
Упражнения 233 8.6. Как может измениться количество компонент сильной связности орграфа при добавлении к нему одной дуги? 8.7. Пусть в графе G(V,E) заданы вероятности успешного прохождения дуг, О P[v] < 1. Вероятность успешного прохождения пути определяется как произведение вероятностей составляющих его дуг. Построить алгоритм на- хождения наиболее надежного (то есть имеющего наибольшую вероятность) пути от вершины s к вершине t.
ГЛАВА 9 Деревья Деревья заслуживают отдельного и подробного рассмотрения по двум причинам. ► Деревья являются в некотором смысле простейшим классом графов. Для них выполняются многие свойства, которые не всегда выполняются для графов в общем случае. Применительно к деревьям многие доказательства и рассужде- ния оказываются намного проще. Выдвигая какие-то гипотезы при решении задач теории графов, целесообразно сначала их проверять на деревьях. ► Деревья являются самым распространенным классом графов, применяемых в программировании, причем в самых разных ситуациях. Более половины объ- ема этой главы посвящено рассмотрению конкретных применений деревьев в программировании. 9.1. Свободные деревья Изучение деревьев целесообразно начать с самых общих определений и устано- вления основных свойств. 9.1.1. Определения Граф без циклов называется ациклическим, или лесом. Связный ациклический граф называется (свободным) деревом. Таким образом, компонентами связности леса являются деревья. ЗАМЕЧАНИЕ------------------------------------------------------- Прилагательное «свободное» употребляется в том случае, когда нужно подчеркнуть от- личие деревьев от других объектов, родственных деревьям: ориентированных деревьев, упорядоченных деревьев и т. д. В связном графе G выполняется неравенство q(G) p(G) — 1. Граф G, в котором <?(G) = p(G) — 1, называется древовидным.
9.1. Свободные деревья 235 В ациклическом графе G z(G) = 0. Пусть и, v — несмежные вершины графа G, х = (и, и) £ Е. Если граф G + х имеет только один простой цикл, z(G 4- х) = 1, то граф G называется субциклическим. Пример На рис. 9.1 показаны диаграммы всех различных (свободных) деревьев с 5 вер- шинами, а на рис. 9.2 — диаграммы всех различных (свободных) деревьев с 6 вершинами. Рис. 9.1. Свободные деревья с 5 вершинами Рис. 9.2. Свободные деревья с 6 вершинами 9.1.2. Основные свойства деревьев Следующая теорема устанавливает, что два из четырех свойств — связность, аци- кличность, древовидность и субцикличность — характеризуют граф как дерево. ТЕОРЕМА Пусть G(V, Е) — граф с р вершинами, q ребрами, к компонентами связности и z простыми циклами. Пусть далее х — ребро, соединяющее любую пару несмежных вершин в G. Тогда следующие утверждения эквивалентны: 1. G — дерево, то есть связный граф без циклов, fc(G) = l&z(G) = 0; 2. любые две вершины соединены в G единственной простой цепью, Vu, v 3! (и, и); 3. G — связный граф, и любое ребро есть мост, fc(G) = 1 & Ve е Е k(G - е) > 1;
236 Глава 9. Деревья 4. G — связный и древовидный, k(G) = l&g(G)=p(G)-l; 5. G — ациклический и древовидный, z(G) = 0&g(G)=p(G)-l; 6. G — ациклический и субциклический, 4G) = 0&z(G + x) = 1; 7. G — связный, субциклический и неполный, fc(G) = l&G^Kp&p^ 3&z(G + i) = 1; 8. G — древовидный и субциклический (за двумя исключениями), g(G)=p(G)-l&G^kiUK3&G^K2UK3&4G' + a:) = l- Доказательство 1 ==> 2 : От противного. Пусть существуют две цепи {и, v) (рис. 9.3 слева). Тогда W1,W2 — простой цикл. 2 => 3 : Имеем: Vu, v 3! (и, v), следовательно, fc(G) = 1. Далее от противного. Пусть ребро х — не мост. Тогда в G — х концы этого ребра связаны цепью. Само ребро х — вторая цепь. S ==> 4 : Индукция по р. База: р = 1 =► q = 0. Пусть g(G) = p(G)—1 для всех гра- фов G с числом вершин меньше р. Тогда удалим из G ребро х (которое является мостом). Получим две компоненты G' и G", удовлетворяющие индукционному предположению. Имеем: q' = р' - 1, q" = р" - 1, q = q' + q" + 1 = р' - 1 + р" - 1 + 1 = р - 1. 4 =Ф 5 : От противного. Пусть есть цикл с п вершинами и п ребрами. Остальные р — п вершин имеют инцидентные им ребра, которые связывают их с циклом. Следовательно, q р, что противоречит условию q = р — 1. 5 => 1: Граф без циклов, следовательно, его компоненты — деревья. Пусть их к. Имеем: к к к q = ^qi = ~ 1) = -к-р-к. i=l i=l г=1 Но q = р — 1, следовательно, к = 1. 5 ==> 6 : По ранее доказанному 5 ==> 1 ==> 2. Имеем: Vtz, v 3! {и, v). Соединив две несмежные вершины, получим единственный простой цикл. 6 ==> 7: При р > 3 граф Кр содержит цикл, следовательно, G 0 Кр. Далее от противного. Пусть G несвязен, тогда при соединении ребром двух ком- понент связности цикл не возникнет. 7 ==> 2 : Имеем fc(G) = 1, следовательно, V и, v 3 {и, и). Пусть цепь не единствен- ная. Тогда существует цикл Z, причем Z = = С3. Действительно, пусть Z > Сз, тогда, соединив две несмежные верНшны этого цикла, получим два цикла. Но G связен и G / К3, следовательно, существу- ет другая вершина w, смежная с Z = К3 (см. рис. 9.3 справа). Если w
9.1. Свободные деревья 237 смежна с более чем одной вершиной Z, то имеем больше одного цикла. Если w смежна только с одной вершиной Z, то соединив ее с другой вершиной, получим два цикла. Рис. 9.3. Иллюстрации к доказательству теоремы о свойствах деревьев 7 =$ 8 : Имеем fc(G) = 1, следовательно, G / К2 U Кз, G / JG U 7Г3. Имеем по доказанному: 7 ==> 2 ==> 3 ==> 4, то есть q = р - 1. 8 => 5 : От противного. Пусть в G есть цикл Z = Сп. Если п > 3, то если внутри Z уже есть смежные вершины, имеем два цикла. Если в Z нет смежных вершин, то, соединив несмежные вершины в Z, получим два цикла. Сле- довательно, Z = Кз. Этот цикл Z является компонентой связности G. Действительно, пусть это не так. Тогда существует вершина w, смежная с Z. Если w смежна более чем с одной вершиной Z, то имеем больше одного цикла. Если w смежна только с одной вершиной Z, то, соеди- нив ее с другой вершиной, получим два цикла. Рассмотрим G': = G — Z. Имеем: р = р' + 3, q = д' + 3. Но q = р — 1, следовательно, q' = р' — 1. От- сюда z(G') = 0, так как один цикл уже есть. Следовательно, компоненты G' — деревья. Пусть их к. Имеем: к к к = 52 & = 52(pi -!) = 52pi -к=р' -k, г=1 г=1 t=l но q’ — pf — 1, следовательно, к = 1, то есть дерево одно. Если в этом дереве соединить несмежные вершины, то получим второй цикл. Два исключения: деревья, которые не имеют несмежных вершин, — это К± и К2. Общая схема доказательства представлена на рис. 9.4. Граф доказательства силь- но связен, следовательно, теорема доказана. О СЛЕДСТВИЕ В любом нетривиальном дереве имеются по крайней мере две ви- сячие вершины. Доказательство Рассмотрим дерево G(V, Е). Дерево — связный граф, следовательно, VtJj eV d(vi) 1.
238 Глава 9. Деревья Рис. 9.4. Схема доказательства теоремы о свойствах деревьев Далее от противного. Пусть Vvj G 1-.р — 1 d(v) > 1. Тогда р 2q = ^2 dip-t) > 2(р - 1) + 1 = 2р - 1. i=i Но q = р — 1, то есть 2q = 2р - 2. Имеем противоречие: 2р — 2 > 2р - 1. □ 9.2. Ориентированные, упорядоченные и бинарные деревья Ориентированные (упорядоченные) деревья являются абстракцией иерархиче- ских отношений, которые очень часто встречаются как в практической жизни, так и в математике и в программировании. Дерево (ориентированное) и иерар- хия — это равнообъемные понятия. 9.2.1. Ориентированные деревья Ориентированным деревом (или ордеревом, или корневым деревом) называется орграф со следующими свойствами: 1. существует единственный узел, полустепень захода которого равна 0. Он на- зывается корнем ордерева; 2. полустепень захода всех остальных узлов равна 1; 3. каждый узел достижим из корня.
9.2. Ориентированные, упорядоченные и бинарные дереаья 239 Пример На рис. 9.5 приведены диаграммы всех различных ориентированных деревьев с 3 узлами, а на рис. 9.6 показаны диаграммы всех различных ориентированных деревьев с 4 узлами. Рис. 9.5. Ориентированные деревья с 3 узлами Рис. 9.6. Ориентированные деревья с 4 узлами ТЕОРЕМА Ордерево обладает следующими свойствами: 1. q = р - 1; 2. если в ордереве отменить ориентацию ребер, то получится свободное дерево; 3. в ордереве нет контуров; 4. для каждого узла существует единственный путь, ведущий в этот узел из корня; 5. подграф, определяемый множеством узлов, достижимых из узла v, является ордеревом с корнем v (это ордерево называется поддеревом узла v); 6. если в свободном дереве любую вершину назначить корнем, то получится ор- дерево. Доказательство 1. Каждое ребро входит в какой-то узел. Из п. 3 определения 9.2.1 имеем: Vv G V\{u} d+(y) = 1, следовательно, q = р — 1. 2. Пусть G — рдерево, граф G' получен из G отменой ориентации ребер, и — корень. Тогда VVjV2 е V 3 (th, и} 6 G' & 3 {и, v2) & G', следовательно, Vv2 3 (t>i, v2} и граф G' связен. Таким образом, учитывая п. 4. теоремы 9.1.2, G' — дерево.
240 Глава 9. Деревья 3. Следует из 2. 4. От противного. Если бы в G существовали два пути из и в v, то в G' имелся бы цикл. 5. Пусть Gv — правильный подграф, определяемый множеством узлов, достижи- мых из V. Тогда d,Q^ {у} = 0, иначе узел v был бы достижим из какого-то узла v’ G Gv и, таким образом, в Gv, а значит, и в G имелся бы контур, что противоречит 3. Далее имеем: Vu' е G„\{u} d+(u') = 1, так как Gv с G. Все вершины Gv достижимы из v по построению. По определению 9.2.1 получаем, что Gv — ордерево. 6. Пусть вершина и назначена корнем и дуги последовательно ориентированы «от корня» обходом в глубину. Тогда d+(u) = 0 по построению; Vti € V\{u} d+(y) = 1, так как входящая дуга появляется при первом посещении узла; все узлы достижимы из корня, так как обход в глубину посещает все вершины связного графа. Таким образом, по определению 9.2.1 получаем ордерево. □ ЗАМЕЧАНИЕ------------------------------------------------------- Каждое свободное дерево определяет не более р ориентированных деревьев. Таким обра- зом, общее число различных ордеревьев с р узлами не более чем в р раз превосходит общее число различных свободных деревьев с р вершинами. Концевая вершина ордерева называется листом. Путь из корня в лист называется ветвью. Длина наибольшей ветви ордерева называется высотой. Уровень узла ордерева — это расстояние от корня до узла. Сам корень имеет уровень 0. Узлы одного уровня образуют ярус дерева. ЗАМЕЧАНИЕ-------------------------------------------------------- Наряду с «растительной» применяется еще и «генеалогическая» терминология. Узлы, до- стижимые из узла и, называются потомками узла и (потомки образуют поддерево). Если в дереве существует дуга (u,v), то узел и называется отцом (или родителем) узла v, а узел v называется сыном узла и. Сыновья одного узла называются братьями. 9.2.2. Эквивалентное определение ордерева Ордерево Т — это конечное множество узлов, таких что: 1. имеется один узел г, называемый корнем данного дерева; 2. остальные узлы (исключая корень) содержатся в к попарно непересекающихся множествах Tr,. ..,Tk, каждое из которых является ордеревом (к 0).
9.2. Ориентированные, упорядоченные и бинарные деревья 241 9.2.3. Упорядоченные деревья Множества Ti,... ,Tk в экивалентном определении ордерева являются поддере- вьями. Если относительный порядок поддеревьев Т),... ,Tk фиксирован, то ор- дерево называется упорядоченным. Пример Ориентированные и упорядоченные ориентированные деревья интенсивно ис- пользуются в программировании. 1. Выражения. Для представления выражений языков программирования, как правило, используются ориентированные упорядоченные деревья. Пример представления выражения а + b * с показан на рис. 9.7 слева. 2. Для представления блочной структуры программы и связанной с ней струк- туры областей определения идентификаторов часто используется ориентиро- ванное дерево (может быть, неупорядоченное, так как порядок определения переменных в блоке в большинстве языков программирования считается не- существенным). На рис. 9.7 в центре показана структура областей определе- ния идентификаторов a, b, с, d, е, причем для отображения структуры дерева использована альтернативная техника. 3. Для представления иерархической структуры вложенности элементов данных и/или операторов управления часто используется техника отступов, показан- ная на рис. 9.7 справа. Рис. 9.7. Примеры изображения деревьев в программировании 4. Структура вложенности каталогов и файлов в современных операционных системах является упорядоченным ориентированным деревом. ОТСТУПЛЕНИЕ---------------------------------------------------- Это отражается даже в терминологии — «корневой каталог диска». 5. Различные «уравновешенные скобочные структуры» (например (a(t>)(c(d)(e)))) являются ориентированными упорядоченными деревьями.
242 Глава 9. Деревья ЗАМЕЧАНИЕ-----------------------------------------=------------- Общепринятой практикой при изображении деревьев является соглашение о том, что ко- рень находится наверху и все стрелки дуг ориентированы сверху вниз, поэтому стрелки можно не изображать. Таким образом, диаграммы свободных, ориентированных и упоря- доченных деревьев оказываются графически неотличимыми, и требуется дополнительное указание, дерево какого класса изображено на диаграмме. В большинстве случаев это ясно из контекста. Пример На рис. 9.8 приведены три диаграммы деревьев, которые внешне выглядят раз- личными. Обозначим дерево слева — (1), в центре — (2) и справа — (3). Как упорядоченные деревья, они все различны: (1) / (2), (2) / (3), (3) / (1). Как ориентированные деревья (1) = (2), но (2) (3). Как свободные деревья, они все изоморфны: (1) = (2) = (3). Рис. 9.8. Диаграммы деревьев 9.2.4. Бинарные деревья Бинарное дерево — это конечное множество узлов, которое либо пусто, либо со- стоит из корня и двух непересекающихся бинарных деревьев — левого и правого. Бинарное дерево не является упорядоченным ордеревом. Пример На рис. 9.9 приведены две диаграммы деревьев, которые изоморфны как упорядо- ченные, ориентированные и свободные деревья, но не изоморфны как бинарные деревья. Рис. 9.9. Два различных бинарных дерева
9.3. Представление деревьев в ЭВМ 243 9.3. Представление деревьев в ЭВМ Обсуждению представлений деревьев можно предпослать в точности те же рас- суждения, что были предпосланы обсуждению представлений графов (см. раз- дел 7.4). Кроме того, следует подчеркнуть, что задача представления деревьев в программе встречается гораздо чаще, чем задача представления графов общего вида, а потому методы ее решения оказывают еще большее влияние на практику программирования. 9.3.1. Представление свободных, ориентированных и упорядоченных деревьев Всякое свободное дерево можно ориентировать, назначив один из узлов корнем. Всякое ордерево можно произвольно упорядочить. Всякое упорядоченное дерево можно представить бинарным деревом, проведя правую связь к старшему брату, а левую — к младшему сыну. Пример На рис. 9.10 приведены диаграммы упорядоченного и соответствующего ему би- нарного деревьев. Рис. 9.10. Упорядоченное и бинарное деревья Таким образом, достаточно рассмотреть представление в ЭВМ бинарных де- ревьев. ЗАМЕЧАНИЕ---------------------------------------------------------— Из данного представления следует, что множество бинарных деревьев взаимнооднозначно соответствует множеству упорядоченных лесов упорядоченных деревьев.
244 Глава 9. Деревья 9.3.2. Представление бинарных деревьев Обозначим через п(р) объем памяти, занимаемой представлением бинарного де- рева, где р — число узлов. Наиболее часто используются следующие представле- ния бинарных деревьев. 1. Списочные структуры: каждый узел представляется записью типа N, содер- жащей два поля (Z й г) с указателями на левый и правый узлы и еще одно поле i для хранения указателя на информацию об узле. Дерево представля- ется указателем на корень. Тип N обычно определяется следующим образом: N = record г : info; l,r N end record. Для этого представления п(р) = Зр. ЗАМЕЧАНИЕ------------------------------------------------------ Поскольку в бинарном дереве, как и в любом другом, q = р — 1, то из 2р указателей, отводимых для хранения дуг, р +1 всегда хранит значение nil, то есть половина связей не используется. 2. Упакованные массивы: все узлы располагаются в массиве, так что все узлы поддерева данного узла располагаются вслед за этим узлом. Вместе с каждым узлом хранится индекс узла, который является последним узлом поддерева данного узла. Дерево Т обычно определяется следующим образом: Т : array [l..p] of record i: info, к : l..p end record. Для этого представления n(p) = 2p. 3. Польская запись: аналогично, но вместо связей фиксируется «размеченная степень» каждого узла (например, 0 означает, что это лист, 1 — есть левая связь, но нет правой, 2 — есть правая связь, но нет левой, 3 — есть обе свг!зи). Дерево Т определяется следующим образом: Т : array [l..p] of record i: info, d : 0..3 end record. Для этого представления n(p) = 2p. Если степень узла известна из информации, хранящейся в самом узле, то можно не хранить и степень. Такой способ представления деревьев называется польской записью и обычно используется для представления выражений. В этом случае предста- вление дерева оказывается наиболее компактным: объем памяти п(р) = р. 9.3.3. Обходы бинарных деревьев Большинство алгоритмов работы с деревьями основаны на обходах. Возможны следующие основные обходы бинарных деревьев: Прямой (левый) обход: попасть в корень, обойти левое поддерево, обойти правое поддерево. Обратный (симметричный) обход: обойти левое поддерево, попасть в корень, обойти правое поддерево. Концевой (правый) обход: обойти левое поддерево, обойти правое поддерево, попасть в корень.
9.3. Представление деревьев в ЭВМ 245 Кроме трех основных, возможны еще три соответствующих обхода, отличающих- ся порядком рассмотрения левых и правых поддеревьев. Этим исчерпываются обходы, если в представлении фиксированы только связи «отец-сын». ЗАМЕЧАНИЕ------------------------------------------------------— Если кроме связей «отец-сын» в представлении есть другие связи, то возможны и другие (более эффективные) обходы. «Деревья», в которых пустые поля I и г. в структуре N используются для хранения дополнительных связей, называются прошитыми деревьями. Пример Концевой обход Дерева выражения а+Ь*с дает обратную польскую запись этого выражения: аЬс * +. ОТСТУПЛЕНИЕ----------------------------------------------------- Польская запись выражений (прямая или обратная) применяется в некоторых языках программирования непосредственно и используется в качестве внутреннего представле- ния программ во многих трансляторах и интерпретаторах. Причина заключается в том, что такая форма записи допускает очень эффективную интерпретацию (вычисление зна- чения) выражений. Например, значение выражения в обратной польской записи может быть вычислено при однократном просмотре выражения слева направо с использованием одного стека. В таких языках, как Forth и PostScript, обратная польская запись исполь- зуется как основная. 9.3.4. Алгоритм симметричного обхода бинарного дерева Реализация обходов бинарного дерева с помощью рекурсивной процедуры не вы- зывает затруднений. В некоторых случаях из соображений эффективности при- менение явной рекурсии оказывается нежелательным. Следующий очевидный алгоритм реализует наиболее популярный симметричный обход без рекурсии, но с использованием стека. Алгоритм 9.1. Алгоритм симметричного обхода бинарного дерева Вход: бинарное дерево, представленное списочной структурой, г — указатель на корень. Выход: последовательность узлов бинарного дерева в порядке симметричного обхода. Т: = 0; р: = г { вначале стек пуст и р указывает на корень дерева } М : { анализирует узел, на который указывает р } if р = nil then if Т — 0 then stop { обход закончен } end if p ч- T { левое поддерево обойдено } yield p { очередной узел при симметричном обходе } р: =р.г { начинаем обход правого поддерева }
246 Глава 9. Деревья else р —> Т { запоминаем текущий узел ... } р: =р.1 { ... и начинаем обход левого поддерева } end if goto М 9.4. Деревья сортировки В этом разделе обсуждается одно конкретное применение деревьев в програм- мировании, а именно деревья сортировки. При этом рассматриваются как те- оретические вопросы, связанные, например, с оценкой высоты деревьев, так и практическая реализация алгоритмов, а также целый ряд прагматических аспек- тов применения деревьев сортировки и некоторые смежные вопросы. 9.4.1. Ассоциативная память В практическом программировании для организации хранения данных и доступа к ним часто используется механизм, который обычно называют ассоциативной памятью. При использовании ассоциативной памяти данные делятся на порции (называемые записями), и с каждой записью ассоциируется ключ. Ключ — это значение из некоторого вполне упорядоченного множества, а записи могут иметь произвольную природу и различные размеры. Доступ к данным осуществляется по значению ключа, которое обычно выбирается простым, компактным и удоб- ным для работы. Пример Ассоциативная память используется во многих областях жизни. 1. Толковый словарь или энциклопедия: записью является словарная статья, а ключом — заголовок словарной статьи (обычно его выделяют жирным шриф- том). 2. Адресная книга: ключом является имя абонента, а записью — адресная инфор- мация (телефон(ы), почтовый адрес и т. д.). 3. Банковские счета: ключом является номер счета, а записью — финансовая информация (которая может быть очень сложной). Таким образом, ассоциативная память должна поддерживать по меньшей мере три основные операции: 1. добавить (ключ, запись); 2. найти (ключ): запись; 3. удалить (ключ). Эффективность каждой операции зависит от структуры данных, используемой для представления ассоциативной памяти. Эффективность ассоциативной памя- ти в целом зависит от соотношения частоты выполнения различных операций в данной конкретной программе.
9.4. Деревья сортировки 247 ЗАМЕЧАНИЕ-----------------------------------------------------— Таким образом, невозможно указать способ организации ассоциативной памяти, который оказался бы наилучшим во всех возможных случаях. 9.4.2. Способы реализации ассоциативной памяти Для представления ассоциативной памяти используются следующие основные структуры данных: 1. неупорядоченный массив; 2. упорядоченный массив; 3. дерево сортировки — бинарное дерево, каждый узел которого содержит ключ и обладает следующим свойством: значения ключа во всех узлах левого под- дерева меньше, а во всех узлах правого поддерева больше, чем значение ключа в узле; 4. таблица расстановки (или хэш-таблица). При использовании неупорядоченного массива алгоритмы реализации операций ассоциативной памяти очевидны: 1. операция «добавить (ключ, запись)» реализуется добавлением записи в конец массива; 2. операция «найти (ключ): запись» реализуется проверкой в цикле всех записей в массиве; 3. операция «удалить (ключ)» реализуется поиском удаляемой записи, а затем перемещением всех последующих записей на одну позицию вперед. Для упорядоченного массива имеется эффективный алгоритм поиска, описанный в следующем подразделе. Реализация остальных операций очевидна. Основное внимание в этом разделе уделено алгоритмам выполнения операций с деревом сортировки. ОТСТУПЛЕНИЕ---------------------------------------------------------- Таблицы расстановки являются чрезвычайно важным практическим приемом программи- рования, подробное описание которого выходит за рамки этого учебника. Вкратце основ- ная идея заключается в следующем. Подбирается специальная функция, которая называ- ется хэш-функцией, переводящая значение ключа в адрес хранения записи (адресом может быть индекс в массиве, номер кластера на диске й т. д.). Таким образом, имея ключ, с по- мощью хэш-функции сразу определяется место хранения записи и открывается доступ к ней. Хэш-функция подбирается таким образом, чтобы разным ключам соответствовали, по возможности, разные адреса из диапазона возможных адресов записей. Как правило, мощ- ность множества ключей существенно больше размера пространства адресов, которое, в свою очередь, больше количества одновременно хранимых записей. Поэтому при исполь- зовании хэширования возможны коллизии — ситуации, когда хэш-функция сопоставляет один и тот же адрес двум актуальным записям с различными ключами. Различные мето- ды хэширования отличаются друг от друга способами разрешения коллизий и приемами вычисления хэш-функций.
248 Глава 9. Деревья 9.4.3. Алгоритм бинарного (двоичного) поиска При использовании упорядоченного массива для представления ассоциативной памяти операция поиска записи по ключу может быть выполнена за время O(log2 п) (где п — количество записей) с помощью следующего алгоритма, из- вестного как алгоритм бинарного, (или двоичного) поиска. Алгоритм 9.2. Бинарный поиск Вход: упорядоченный массив А : array [l..n] of record к: key;i: info end record; ключ a: key. Выход: индекс записи с искомым ключом а в массиве А или 0, если записи с таким ключом нет. b: = 1 { начальный индекс части массива для поиска } е: = п { конечный индекс части массива для поиска } while b е do с: —(Ь + е)/2 { индекс проверяемого элемента (округленный до целого) } if А[с].А: > a then е: = с — 1 { продолжаем поиск в первой половине } else if A[c].fc < a then b: = с + 1 { продолжаем поиск во второй половине } else return с { нашли искомый ключ } end if end while return 0 { искомого ключа нет в массиве } Обоснование Для обоснования этого, алгоритма достаточно заметить, что на каждом шаге основного цикла искомый элемент массива (если он есть) находится между (включительно) элементами с индексами Ь и е. Поскольку диапазон поиска на каждом шаге уменьшается вдвое, общая трудоемкость не превосходит log2 п. □ 9.4.4. Алгоритм поиска в дереве сортировки Следующий алгоритм находит в дереве сортировки узел с указанным ключом, если он там есть. Алгоритм 9.3. Поиск узла в дереве сортировки Вход: дерево сортировки Т, заданное указателем на корень; ключ а. Выход: указатель р на найденный узел или nil, если в дереве нет такого ключа. р: = Т { указатель на проверяемый узел } while р / nil do if а < p.i then p: =p.l { продолжаем поиск слева } else if а > p.i then p: = p.r { продолжаем поиск справа } else
9.4. Деревья сортировки 249 return р { нашли узел } end if end while Обоснование Этот алгоритм работает в точном соответствии с определением дерева сорти- ровки: если текущий узел не искомый, то в зависимости от того, меньше или больше искомый ключ по сравнению с текущим, нужно продолжать поиск слева или справа, соответственно. □ 9.4.5. Алгоритм вставки в дерево сортировки Следующий алгоритм вставляет в дерево сортировки узел с указанным ключом. Если узел с указанным ключом уже есть в дереве, то ничего не делается. Вспо- могательная функция NewNode описана в подразделе 9.4.7. Алгоритм 9.4. Вставка узла в дерево сортировки Вход: дерево сортировки Т, заданное указателем на корень; ключ а. Выход: модифицированное дерево сортировки Т. if Т = nil then Т: = NewNode(a) { первый узел в дереве } return Т end if р: = Т { указатель на текущий узел } М :,{ анализ текущего узла } if а < p.i then if p.l = nil then q: = NewNode(a) { создаем новый узел } p.l: = q { и подцепляем его к р слева } return Т else р: =р.1 { продолжаем поиск места для вставки слева } goto М end if end if if a > p.i then if p.l = nil then q: = NewNode(a) { создаем новый узел } p.r: = q { и подцепляем его к р справа } return Т else р: =р.г { продолжаем поиск места для вставки справа } goto М end if end if return T { сюда попали, если уже есть такой ключ! }
250 Глава 9. Деревья Обоснование Алгоритм вставки, в сущности, аналогичен алгоритму поиска: в дереве ищется такой узел, имеющий свободную связь для подцепления нового узла, чтобы не нарушалось условие дерева сортировки. А именно, если новый ключ меньше текущего, то либо его можно подцепить слева (если левая связь свободна), либо нужно найти слева подходящее место. Аналогично, если новый ключ больше текущего. □ 9.4.6. Алгоритм удаления из дерева сортировки Следующий алгоритм удаляет из дерева сортировки узел с указанным ключом. Если узла с указанным ключом нет в дереве, то ничего не делается. Вспомога- тельные процедуры Find и Delete описаны в следующем подразделе. Алгоритм 9.5. Удаление узла из дерева сортировки Вход: дерево сортировки Т, заданное указателем на корень; ключ а. Выход: модифицированное дерево сортировки Т. Find(T’, а, р, q, s) { поиск удаляемого узла } if р — nil then return Т { нет такого узла — ничего делать не нужно } end if if p.r = nil then Delete(p, q, p.l, s) { случай 1, см. рис. 9.11 слева } else и:—p.r if u.l = nil then u.l : = p.l Delete (p, q, u, s) { случай 2, см. рис. 9.11 в центре } else w: = и; v: = u.l while v.l / nil do w: = v; v: = v.l end while p.i: = v.i Delete(i), w, v.r, —1) { случай 3, см. рис. 9.11 справа } end if end if return T Обоснование Удаление узла производится перестройкой дерева сортировки. При этом воз- можны три случая (не считая тривиального случая, когда удаляемого узла нет в дереве и ничего делать не нужно). 1. Правая связь удаляемого узла р пуста (см. рис. 9.11 слева). В этом случае левое поддерево 1 узла р подцепляется к родительскому узлу q с той же сто- роны, с которой был подцеплен узел р. Условие дерева сортировки, очевидно, выполняется.
j.4. деревья сортировки 251 2. Правая связь удаляемого узла р не пуста и ведет в узел и, левая связь кото- рого пуста (см. рис. 9.11 в центре). В этом случае левое поддерево 1 узла р подцепляется к узлу и слева, а сам узел и подцепляется к родительскому узлу q с той же стороны, с которой был подцеплен узел р. Нетрудно проверить, что условие дерева сортировки выполняется и в этом случае. Рис. 9.11. Иллюстрация к алгоритму удаления узла из дерева сортировки 3. Правая связь удаляемого узла р не пуста и ведет в узел и, левая связь кото- рого не пуста. Поскольку дерево сортировки конечно, можно спуститься от узла и до узла v, левая связь которого пуста (см. рис. 9.11 справа). В этом случае выполняются два преобразования дерева. Сначала информация в узле р заменяется на информацию узла v. Поскольку узел v находится в правом поддереве узла р и в левом поддереве узла и, имеем p.i < v.i < u.i. Таким образом, после этого преобразования условие дерева сортировки выполняет- ся. Далее правое поддерево 4 узла v подцепляется слева к узлу w, а сам узел v удаляется. Поскольку поддерево 4 входило в левое поддерево уэла w, условие дерева сортировки также сохраняется. О ЗАМЕЧАНИЕ-----------------------------------------------—----- В книге [8], из которой заимствован данный алгоритм, показано, что хотя алгоритм «вы- глядит несимметричным» (правые и левые связи обрабатываются по-разному), на самом деле в среднем характеристики дерева сортировки не искажаются. 9.4.7. Вспомогательные алгоритмы для дерева сортировки Алгоритмы трех предыдущих разделов используют вспомогательные функции, описанные здесь.
252 Глава 9. Деревья 1 ]1оиск узла — функция Find. 0ход: дерево сортировки Т, заданное указателем на корень; ключ а. рыход: р — указатель на найденный узел или nil, если в дереве нет такого ключа; q — указатель.на отца узла р; s — способ подцепления узла q к узлу р (s = —1, если р слева от q; s = +1, если р справа от g; s = 0, если р — корень). р: = Т; q: = nil; s: = 0 { инициализация } while р / nil do if p.i — a then return p,q,s end if q.=p { сохранение значения p } if a < p.i then p:=p.l;s: — — 1 { поиск слева } else p:=p.r;s: = +l { поиск справа } end if end while ОТСТУПЛЕНИЕ................................................................. В этой простой функции стоит обратить внимание на использование указателя q, кото- рый от£леживает значение указателя р «с запаздыванием», то есть указатель q «помнит» предыдущее значение указателя р. Такой прием полезен при обходе однонаправленных структур данных, в которых невозможно вернуться назад. 2. Удаление узла — процедура Delete. Вход: pl — указатель на удаляемый узел; р2 — указатель на подцепляющий узел; рЗ - указатель на подцепляемый узел; s — способ подцепления. Выход: преобразованное дерево. if s = — 1 then p2.l: = рЗ { подцепляем слева } end if if s = +1 then p2.r:=p3 { подцепляем справа } end if dispose(pl) { удаляем узел } 3. Создание нового узла — конструктор NewNode. Вход: ключ а. Выход: указатель р на созданный узел. new(p); p.i :=a;p.l:= nil; p.r: = nil return p 9.4.8. Сравнение представлений ассоциативной памяти Пусть п — количество элементов в ассоциативной памяти. Тогда сложностьопе- раций для различных представлений ограничена сверху следующим образом.
9.4. Дерё^ья сортировки 253 Неупорядоченный Упорядоченный Дерево массив массив сортировки Добавить Найти Удалить 0(1) О(п) O(log2(n))..O(n) O(n) O(log2(n)) O(log2(n))..O(n) О(п) О(п) O(log2(n))..O(n) Эффективность операций с деревом сортировки ограничена сверху высотой де- рева. ЗАМЕЧАНИЕ-------------------------------------------------------- Дерево сортировки может расти неравномерно. Например, если при загрузке дерева ис- ходные данные уже упорядочены, то полученное дерево будет право- или лёволипейным и будет даже менее эффективным, чем неупорядоченный массив. 9.4.9. Выровненные деревья Ордерево называется выровненным, если все узлы, степень которых меньше 2, располагаются на одном или двух последних уровнях. Выровненное дерево имеет наименьшую возможную для данного р высоту h. Пример На рис. 9.12 приведены диаграммы выровненного (слева) и невыровненного (справа) деревьев. Рис. 9.12. Выровненное (слева) и невыровненное деревья ЛЕММА £ Lo = 2fe+1 ~ 1 Доказательство Индукция по к. База: к = 0 ==> 2° = 1, 21 - 1 — 1, 1 = 1. к Пусть 52 21 = 2fe+1 - 1, тогда i=0 fc4-l к 2* । 2fc+1 = 2fc+1_1 । 2fc+1 = 2(*+1)+1_1 С i=0 г=0
254 Глава 9 Деревья ТЕОРЕМА Для выровненного бинарного дерева log2(p 4- 1) — 1 h < log2(p 4- 1). Доказательство На г-м уровне может быть самое большее 2г вершин, следовательно, h—1 h У>‘<„с£2‘. г—0 г=0 По лемме имеем: 2h -1 < р С 2h+1 -1 и 2h < р4-1 2h+1. Логарифмируя, имеем: h < log2(p 4- 1) & h + 1 log2(p + 1). Следовательно, log2(p 4-1) - Ю < log2(p 4-1). ЗАМЕЧАНИЕ---------------------------------------------------------- Выровненные деревья дают наибольший возможный эффект при поиске. Однако извест- но, что вставка/удаление может потребовать полной перестройки всего дерева и, таким образом, трудоемкость операции в худшем случае составит О(р). 9.4.10. Сбалансированные деревья (Бинарное) дерево называется подровненным деревом, или АВЛ-деревом (Адель- сон-Вельский и Ландис, 1962), или сбалансированным деревом, если для любого узла высота левого и правого поддеревьев отличается не более чем на 1. Пример На рис. 9.13 приведена диаграмма максимально несимметричного сбалансиро- ванного дерева, в котором для всех узлов высота левого поддерева ровно на 1 больше высоты правого поддерева. ТЕОРЕМА Для подровненного бинарного дерева h <2 log2 р. Доказательство Рассмотрим наиболее несимметричные АВЛ-деревья, скажем, такие, у которых всякое левое поддерево на 1 выше правого. Такие АВЛ-деревья имеют макси- мальную возможную высоту среди всех АВЛ-деревьев с заданным числом вер- шин. Пусть Ph — число вершин в наиболее несимметричном АВЛ-дереве вы- соты h. По построению имеем: р = Ph = Ph-r 4- Ph-2 + 1- Непосредственно проверяется, что Ро — 1, Pi = 2, Р2 = 4. Покажем по индукции, что Ph База: Ро = 1, (%/2)° = 1, 1 > 1; Pi = 2 (л/2)1 = у/2, 2 у/2.
9.5. Кратчайший остов 255 Пусть Ph (х/2)\ Тогда Ph+i = Ph + Ph-i + 1 > (V2)h + (V^)^1 + 1 = 11 1 = ('/5>‘(1 + (75 + W*" (v5)‘(I + (75> = =(v5,“ Имеем: (x/2)h = 2h/2 Ph — p, следовательно, log2p и h 21og2p. □ ЗАМЕЧАНИЕ-------------------------------------------- Известна более точная оценка высоты АВЛ-дерева: h < log^+1j2 2 log2 р. Сбалансированные деревья уступают выровненным деревьям по скорости поис- ка (менее чем в два раза), однако их преимущество состоит в том, что известны алгоритмы вставки и удаления узлов в сбалансированное дерево, которые сохра- няют сбалансированность и в то же время при перестройке дерева затрагива- ют только конечное число узлов (см., например, [13]). Поэтому в подавляющем большинстве случаев АВЛ-дерево оказывается наилучшим вариантом предста- вления дерева сортировки. 9.5. Кратчайший остов Задача отыскания кратчайшего остова графа является классической задачей тео- рии графов. Методы решения этой задачи послужили основой для многих других важных результатов. В частности, исследования алгоритма Краскала, описанно- го в подразделе 9.5.3, привели в конечном счете к теории жадных алгоритмов, изложенной в разделе 2.7.5.
256 Глава 9. Деревья 9.5.1. Определения Пусть G(V, Е} — граф. Остовной подграф графа (/(У, Е) — это подграф, содержа- щий все вершины. Остовный подграф, являющийся деревом, называется осто- вом. ЗАМЕЧАНИЕ-------------------------------------------------- Остов определяется множеством ребер, поскольку вершины остова суть вершины графа. Несвязный граф не имеет остова. Связный граф может иметь много остовов. ОТСТУПЛЕНИЕ------------------------------------------------------- Если задать длины ребер, то можно поставить задачу нахождения кратчайшего остова. Эта задача имеет множество практических интерпретаций. Например, пусть задано множество аэродромов и нужно определить минимальный (по сумме расстояний) набор авиарейсов, который позволил бы перелететь с любого аэродрома на любой другой. Решением этой задачи будет кратчайший остов полного графа расстояний между аэродромами. ЗАМЕЧАНИЕ ----------------------------------------------------- Существует множество различных способов найти какой-то остов графа. Например, алго- ритм поиска в глубину строит остов (по ребрам возврата). Множество кратчайших путей Из заданной вершины ко всем остальным также образует остов. Однако этот остов может не быть кратчайшим. Пример На рис. 9.14 показаны диаграммы (слева направо) графа, дерева кратчайших путей из вершины 1 с суммарным весом 5 и два кратчайших остова этого графа. Рис. 9.14. Граф, дерево кратчайших путей и два кратчайших остова 9.5.2. Схема алгоритма построения кратчайшего остова Рассмотрим следующую схему алгоритма построения кратчайшего остова. Пусть Т — множество непересекающихся деревьев, являющихся подграфами графа G. Вначале Т состоит из отдельных вершин графа G, в конце Т содержит един- ственный элемент — кратчайший остов графа G.
9.5. Кратчайший остов 257 Алгоритм 9.6. Построение кратчайшего остова Вход: граф G(V, Е), заданный матрицей длин ребер С. Выход: кратчайший остов Т. T-. = V while в Т больше одного элемента do взять любое поддерево из Т найти к нему ближайшее соединить эти деревья в Т end while ТЕОРЕМА Алгоритм 9.6 строит кратчайший остов. Доказательство Пусть Ti и Tj — два произвольных поддерева G, Т П Tj / 0. Положим t j C J. i C J. j Так как с самого начала все вершины G покрыты деревьями из Т, то всегда реализуется на некотором ребре с длиной Cj j. Далее индукцией по шагам алго- ритма 9.6 покажем, что все ребра, включенные в Т, принадлежат кратчайшему остову — SST *. Вначале выбранных ребер нет, поэтому их множество включа- ется в кратчайший остов. Пусть теперь все ребра, добавленные в Т, принадлежат SST. Рассмотрим очередной шаг алгоритма. Пусть на этом шаге добавлено ребро (г, j), соединяющее поддерево Ti с поддеревом Tj. Если (г, j) SST, то, посколь- ку SST является деревом и, стало быть, связен, 3(г*, j*) € SST, соединяющее Т с остальной частью SST. Тогда удалим из SST ребро (г*, j*) и добавим ребро (г, j): SST' : = SST-(г*+ Полученный подграф SST' является остовом, причем более коротким, чем SST, что противоречит выбору SST. □ ЗАМЕЧАНИЕ---------------------------------------------------- Различные способы выбора поддерева для наращивания на первом шаге тела цикла Дают различные конкретные варианты алгоритма построения SST. 9.5.3. Алгоритм Краскала Следующий жадный алгоритм, известный как алгоритм Краскала, находит крат- чайший остов в связном графе. Алгоритм 9.7. Алгоритм Краскала Вход: список Е ребер графа G с длинами. Выход: множество Т ребер кратчайшего остова. Т: = 0 упорядочить Е в порядке возрастания длин к: = 1 { помер рассматриваемого ребра } 'SST — Shortest Sceleton Tree — стандартное обозначение для кратчайшего остова.
258 Глава 9. Деревья for г from 1 to p — 1 do while добавление ребра E(k) образует цикл в Т do к: = к + 1 { пропустить это ребро } end while 7: = T U {E[fc]} { добавить это ребро в SST } end for Обоснование Заметим, что множество подмножеств множества ребер, не содержащих циклов, образует матроид (см. раздел 2.7). Действительно, если множество ребер не со- держит цикла, то любое подмножество также не содержит цикла. Пусть теперь Е' С Е — произвольное множество ребер, a G' — правильный подграф графа G, определяемый этими ребрами. Очевидно, что любое максимальное не содержа- щее циклов подмножество множества Е' является объединением остовов ком- понент связности G' и по теореме об основных свойствах деревьев (см. подраз- дел 9.1.2) содержит p(G') — fc(G') элементов. Таким образом, то. теореме подраз- дела 2.7.2 множество ациклических подмножеств ребер образует матроид. Далее, рассматриваемый алгоритм, как жадный алгоритм, находит кратчайшее ацикли- ческое подмножество множества ребер. По построению оно содержит р - 1 эле- мент, а значит, является искомым остовом. □ ОТСТУПЛЕНИЕ--------------------------------------------------- Задача о нахождении кратчайшего остова принадлежит к числу немногих задач теории графов, которые можно считать полностью решенными. Между тем, если изменить усло- вия задачи, на Первый взгляд даже незначительно, то она оказывается значительно более трудной. Рассмотрим следующую задачу. Пусть задано множество городов на плоскости и нужно определить минимальный (по сумме расстояний) набор железнодорожных линий, который позволил бы переехать из любого города в любой другой. Кратчайший остов пол- ного графа расстояний между городами не будет являться решением этой (практически, очевидно, очень важной) задачи, известной как задача Штейнера. На рис. 9.15 приведены, соответственно, диаграммы кратчайшего остова, наивного «решения» задачи Штейнера и правильного решения для случая, когда города расположены в вершинах квадрата. Рис. 9.15. Кратчайший остов, приближенное и точное решение задачи Штейнера
Упражнения 259 Комментарии Материал этой главы затрагивает вопросы, которые очень часто возникают в практическом программировании. Поэтому различные сведения о деревьях мож- но найти не только в специальных учебниках по теории графов, но и в книгах по программированию и конструированию эффективных алгоритмов. В качестве рекомендуемых источников назовем [1, 8, 13]. В частности, алгоритмы операций с деревом сортировки описаны в [8], откуда они заимствованы с некоторыми дополнительными уточнениями способов реализации. В книге [13] можно найти краткие и доступные описания алгоритмов работы с АВЛ-деревьями, которые здесь опущены за недостатком места. Упражнения 9.1. Нарисовать диаграммы всех деревьев с 7 вершинами. 9.2. Допустим, что в ордереве все узлы, кроме листьев, имеют одну и ту же по- лустепень исхода п. В этом случае говорят, что дерево имеет постоянную ширину ветвления п. Оценить высоту h ордерева, которое имеет р узлов и постоянную ширину ветвления п. 9.3. Составить алгоритм преобразования обратной польской записи арифмети- ческого выражения в прямую польскую запись. 9.4. Какой вид будет иметь дерево сортировки после того, как в него последо- вательно добавили следующие текстовые элементы: «1», «2», «3», «4», «5», «6», «7», «8», «9», «10», «11», «12», «13», «14», «15», «16», «17», «18», «19»? 9.5. Доказать, что полный граф Кр имеет р(р~2^ остовов (это утверждение из- вестно как формула Кэли).
ГЛАВА 10 Циклы После рассмотрения ациклических связных графов, то есть деревьев, естественно перейти к рассмотрению графов с циклами. 10.1. Фундаментальные циклы и разрезы Первый раздел главы посвящен установлению связи векторных пространств со структурой циклов и разрезов в Графе. 10.1.1. Циклы и коциклы Цикл может входить только в одну компоненту связности графа, поэтому далее без ограничения общности граф считается связным. Цикл (простой) рассматри- вается как множество ребер. Разрезом связного графа называется множество ребер, удаление которых делает граф несвязным. Простым разрезом называется минимальный разрез, то есть такой, никакое собственное подмножество которого разрезом не является. В этом параграфе рассматриваются только простые циклы и разрезы, далее слово «простые» опускается. Между циклами и разрезами существует определенная двойственность, поэтому разрезы иногда называют коциклами. ЗАМЕЧАНИЕ------------------------------------------------------- Поскольку рассматриваются только простые циклы и коциклы, они могут считаться имен- но множествами, а не последовательностями ребер. ОТСТУПЛЕНИЕ------------------------------------------------------- Чем больше в графе циклов, тем труднее его разрезать. В дереве, напротив, каждое ребро само по себе является разрезом.
10.1. Фундаментальные циклы и разрезы 261 10.1.2. Независимые множества циклов и коциклов Рассмотрим операцию ф сложения по модулю 2 или симметрической разности над множествами ребер: iWjt ф Л/з : — {е j (е G JWj & е АГз) V (е iWi & е G Л/з)}. Множество М называется зависимым или линейной комбинацией множеств {Mj}^=1, если п М = ($М,. г=1 Множество циклов называется независимым, если ни один из циклов Z, не является линейной комбинацией остальных. Множество разрезов {5)}"=1 называется независимым, если ни один из разрезов Si не является линейной комбинацией остальных. ЗАМЕЧАНИЕ—^ ----------- --------------------------------------- Множество подмножеств ребер данного графа образует векторное пространство над дво- ичной арифметикой. Действительно, ф — ассоциативная и коммутативная операция. Да- лее М ф 0 = 0®М' = М и каждый элемент является своим обратным: М ф М = 0. Та- ким образом, подмножества ребер образуют абелеву группу относительно симметричной разности. Далее определим операцию умножения вектора на скаляр: ОМ : = 0, 1М:~М. Легко видеть, что аксиомы векторного пространства выполнены. Введенные здесь поня- тия линейной комбинации, зависимости и независимости являются частными случаями одноименных понятий из разделов 2.5 и 2.7. 10.1.3. Циклический и коциклический ранг Максимальное независимое множество циклов (или минимальное множество ци- клов, от которых зависят все остальные) называется фундаментальной системой циклов. Циклы фундаментальной системы называются фундаментальными, а ко- личество циклов в (данной) фундаментальной системе называется циклическим рангом, или цикломатическим числом, графа G и обозначается m(G). Максималь- ное независимое множество коциклов (разрезов) (или минимальное множество коциклов, от которых зависят все остальные) называется фундаментальной си- стемой коциклов (разрезов). Коциклы (разрезы) фундаментальной системы назы- ваются фундаментальными, а количество коциклов в (данной) фундаментальной системе называется коциклическим рангом, или коцикломатическим числом, графа G и обозначается m*(G). Пусть T(V, Ет) — остов графа G(V, Т). Кодеревом T*(V, Е?) остова Т называется остовный подграф, такой что Е? = Е \ Ет- (Кодерево не является деревом!) Ребра кодерева называются хордами остова. ТЕОРЕМА Если G — связный граф, то m{G') = q — р + 1, m*(G)=p—l.
262 Глава 10. Циклы Доказательство Рассмотрим некоторый остов Т графа G. По теореме 9.1.2 об основных свойствах деревьев каждая хорда е € Т* остова Т порождает ровно один простой цикл ze. Эти циклы независимы, так как каждый из них содержит свое индивидуальное ребро (хорду е). Покажем, что любой цикл графа G зависит от {Ие}е6т-. Заметим, что любой эле- мент фундаментальной системы зависит от фундаментальной системы, поэтому далее элементы фундаментальной системы не рассматриваем, то есть Z Ze. Пусть теперь некоторый цикл Z содержит ребра elt... ,ек G Т*. Такие ребра в Z обязательно есть, в противном случае Z С Т, что невозможно, так как Т — дерево. Докажем индукцией по к, что Z = Zei Ф • • • Ф Zek. База: пусть к = 1, тогда ei £ Т, Z\{ei} С Т и Z — Zet, так как если бы Z Zei, то концы ei были бы соединены в Т двумя цепями, что невозможно по теореме 9.1.2. Пусть (индукционное предположение) Z = Zei ф • • • ф Zem для всех циклов Z с числом хорд m < к. Рассмотрим цикл Z с к хордами ej,... ,е& G Т*. Рассмо- трим Zek. Имеем Z': =(Z\{ek})U(Zejfe\{ek}) — тоже цикл (возможно) не простой). Чо Z' содержит только к — 1 хорду ei,... ,ek-i- По индукционному предположе- нию Z' = Zei ф • • • ф Zefc_j. Добавим к этому циклу ZEk. Имеем: Z' ф Zek = (Z\{efc}) U ((Ze„\{efe}) ф Ze J = (Z\{ek}) U {efc} = Z. Таким образом, {2е}еёт* является фундаментальной системой циклов. Посколь- ку все фундаментальные системы содержат одинаковое количество элементов (как базисы векторного пространства), достаточно ограничиться рассмотрением любой, например, той, которая определяется остовом Т. Пусть теперь е G Т. Определим разрез Se следующим образом. Ребро е — мост в дереве Т. Следова- тельно, удаление ребра е разбивает множество вершин V на два подмножества VS и V2, так что Vi С V, V2 С V, Vi U V2 = V, Vi Г) V2 = 0. Включим в разрез Se ребро е и все ребра графа G, которые соединяют вершины множества Ц с вершинами множества V2. Тогда Se — это разрез, потому что правильные подграфы, определяемые Vi и V2, являются компонентами связности G — Se. Разрез Se — простой, потому что, если есть ребро, соединяющее Ц и V2, то граф связен. Аналогично можно показать, что {5е}еет является фундаментальной системой разрезов. Действительно, любой разрез S содержит хотя бы одно ребро из Т, так как Т — связный остовной подграф. Разрезы {Se}e&T независимы, так как каждый содержит уникальное ребро е. Любой разрез S зависит от {Se}eET, S — ф Se. Далее имеем m*(G) = |{5е}еет| — |£т| = р - 1 и еет m(G) = |{5е}ееГ.| = |.Ег| = |£J| - |ЕГ| = q- (р- 1) = q-p+l. □
10.2. Эйлеровы циклы 263 10.2. Эйлеровы циклы Здесь приведено исчерпывающее решение задачи о Кенигсбергских мостах (см. подраздел 7.1.1), приведшей к исторически первой успешной попытке развития теории графов как самостоятельного предмета. 10.2.1. Эйлеровы графы Если граф имеет цикл (не обязательно простой), содержащий все ребра графа по одному разу, то такой цикл называется эйлеровым циклом, а граф называется эйлеровым графом. Если граф имеет цепь (не обязательно простую), содержащую все вершины по одному разу, то такая цепь называется эйлеровой цепью, а граф называется полуэйлеровым графом. Эйлеров цикл содержит не только все ребра (по одному разу), но и все вершины графа (возможно, по несколько раз). Ясно, что эйлеровым может быть только связный граф. ТЕОРЕМА Если граф G связен и нетривиален, то следующие утверждения экви- валентны: 1 . G — эйлеров граф; 2 . каждая вершина G имеет четную степень; 3 . множество ребер G можно разбить на простые циклы. Доказательство 1 => 2 Пусть Z — эйлеров цикл. Двигаясь по Z, будем подсчитывать степе- ни вершин, полагая их до начала прохождения нулевыми. Прохождение каждой вершины вносит 2 в степень этой вершины. Поскольку Z содер- жит все ребра, то когда обход Z будет закончен, будут учтены все ребра, а степени всех вершин — четные. 2 ==> 3 G — связный и нетривиальный граф, следовательно, V v d(v) > 0. Степени вершин четные, следовательно, V v d(v) 2. Имеем: 2q = ^d(v) ^2p=>q^p^q>p-l. Следовательно, граф G — не дерево, а значит, граф G содержит (хотя бы один) простой цикл Zi. (Zi — множество ребер.) Тогда G — Zi — остовный подграф, в котором опять все степени вершин четные. Исклю- чим из рассмотрения изолированные вершины. Таким образом, G — Z\ тоже удовлетворяет условию 2, следовательно, существует простой цикл Z2 С (G—Zi). Далее выделяем циклы Zi, пока граф не будет пуст. Имеем: Е = (J Zi и П Zi = 0.
264 Глава 10. Циклы 3 => 1 Возьмем какой-либо цикл Zi из данного разбиении. Если Zi = Е, то теорема доказана. Если нет, то существует цикл Z2, такой что Эг>1 (у! G Z1&V1 G Z2), так как G связен. Маршрут Zi U Z2 является циклом и содержит все свои ребра по одному разу. Если Zi U Z2 = Е, то теорема доказана. Если нет, то существует цикл Z3, такой что 3v2 (v2 G Zi U Z2&v2 G Z3). Далее будем наращивать эйлеров цикл, пока он не исчерпает разбиения. □ 10.2.2. Алгоритм построения эйлерова цикла в эйлеровом графе В предыдущем разделе был установлен эффективный способ проверки наличия эйлерова цикла в графе. А именно, для этого необходимо и достаточно убедиться, что степени всех вершин четные, что нетрудно сделать при любом представлении графа. Следующий алгоритм находит эйлеров цикл в графе, если известно, что граф эйлеров. Алгоритм 10.1. Алгоритм построения эйлерова цикла Вход: эйлеров граф G(V, Е), заданный списками смежности (Г[г>] — список вершин, смеж- ных с вершиной v). Выход: последовательность вершин эйлерова цикла. S: = 0 { стек для хранения вершин } select v G V { произвольная вершина } v —> S { положить v в стек S } while S / 0 do v (— S;v S { v — верхний элемент стека } if Г[г>] = 0 then v <— S; yield v else select и G Г[г>] { взять первую вершину из списка смежности } и -> S { положить и в стек } Г[и]: = Г[г>] \ {и}; Г[и]: = Г [и] \ {«} { удалить ребро (г>, и) } end if end while Обоснование Принцип действия этого алгоритма заключается в следующем. Начиная с произ- вольной вершины, строим путь, удаляя ребра и запоминая вершины в стеке, до тех пор пока множество смежности очередной вершины не окажется пустым, что означает, что путь удлинить нельзя. Заметим, что при этом мы с необходимостью придем в ту вершину, с которой начали. В противном случае это означало бы, что вершина v имеет нечетную степень, что невозможно по условию. Таким образом, из графа были удалены ребра цикла, а вершины цикла были сохранены в стеке S. Заметим, что при этом степени всех вершин остались четными. Далее вершина v выводится в качестве первой вершины эйлерова цикла, а процесс продолжается, начиная с вершины, стоящей на вершине стека. □
10.3. Гамильтоновы циклы 265 10.2.3. Оценка числа эйлеровых графов ЛЕММА В любом графе число вершин нечетной степени четно. Доказательство По теореме Эйлера — 2q, то есть сумма степеней всех вершин — четное число. Сумма степеней вершин четной степени четна, значит, сумма степеней вершин нечетной степени также четна, значит, их четное число. □ Пусть 3(р) — множество всех графов с р вершинами, а 8(р) — множество эйле- ровых графов с р вершинами. ТЕОРЕМА Эйлеровых графов почти нет, то есть цим=о. р-»оо |S(p)| Доказательство Пусть £'(р) — множество графов с р вершинами и четными степенями. Тогда по предыдущей теореме 8(р) С 8'(р) и |8(р)| |8'(р)|. В любом графе число вершин нечетной степени четно, следовательно, любой граф из 8'(р) можно получить из некоторого графа S(p — 1), если добавить новую вершину и соединить ее со всеми старыми вершинами нечетной степени. Следовательно, |8'(р)| |8(р~ 1)|. Но |8(р)| = 2с(р’2). Заметим, что Ь| 2!(fc - 3)! fc(fc-l) (fc-l)(fc-2) (fe-l)(fe-fc + 2) _ j 2 2 “ 2 Далее имеем: |8(p)| |£'(p)l |9(p-1)1 = 2c(p-^ = = |S(p)|2-(p-1) £(p) .1 |£(p)| n И 777-7 < -----г, откуда 11И1 ) ' = 0. g(p) 2P-1’ J p—oo ]g(p)| □ 10.3. Гамильтоновы циклы Название «гамильтонов цикл» произошло от задачи «Кругосветное путешест- вие», придуманной Гамильтоном1 в прошлом веке: нужно обойти все вершины графа, диаграмма которого показана на рис. 10.1 (в исходной формулировке это были названия столиц различных стран), по одному разу и вернуться в исходную точку. Этот граф представляет собой укладку додекаэдра. 1 Вильям Гамильтон (1805-1856)
266 Глава 10. Циклы Рис. 10.1. Задача «Кругосветное путешествие» 10.3.1. Гамильтоновы графы Если граф имеет простой цикл, содержащий все вершины графа (по одному ра- зу), то такой цикл называется гамильтоновым циклом, а граф называется гамиль- тоновым графом. Гамильтонов цикл не обязательно содержит все ребра графа. Ясно, что гамиль- тоновым может быть только связный граф. ЗАМЕЧАНИЕ--------------------------------------------------------- Любой граф G можно превратить в гамильтонов, добавив достаточное количество вер- шин. Для этого, например, достаточно к вершинам vi,..., vp графа G добавить вершины ui,... ,ир и множество ребер {(i>i,Uj)} U {(и£,г>£+1)}. ТЕОРЕМА (Дирак) Если в графе G{ V, E)¥v G V d(v) > p/2, то граф G является гамильтоновым. Доказательство От противного. Пусть G — не гамильтонов. Добавим к G минимальное количе- ство новых вершин ui,...,un, соединяя их со всеми вершинами G так, чтобы G': = G + ил -|--р ип был гамильтоновым. Пусть v,ui,w,...,ц — гамильтонов цикл в графе G', причем v G G, щ G G', «1 £ G. Такая пара вершин v и щв гамильтоновом цикле обязательно найдется, иначе граф G был бы гамильтоновым. Тогда w & G, w £ {ui,...,un}, иначе вершина щ была бы не нужна. Более того, вершина v несмежна с вершиной w, иначе вершина иг была бы не нужна. Далее, если в цикле v,ultw,... ... ,v есть вершина и/, смежная с вершиной w, то вершина v' несмежна с вершиной v, так как иначе можно было бы постро- ить гамильтонов цикл v, v',..., w, w'... v без вершины ui, взяЬ последователь- ность вершин w,..., v' в обратном порядке. Отсюда следует, что число вершин графа G', не смежных с v, не менее числа вершин, смежных с w. Но для любой
10.3. Гамильтоновы циклы 267 вершины w графа G d(w) р/2 4- п по построению, в том числе d(v) > р/2 + п. Общее число вершин (смежных и не смежных с v) составляет п 4- р — 1. Таким образом, имеем: — р р п 4- р — 1 = d(v) 4- d( V) > d(w) 4- d(y) -+n + ^-+n = 2n + p. A A Следовательно, 0 n 4-1, что противоречит тому, что п > 0. □ 10.3.2. Задача коммивояжера Рассмотрим следующую задачу, известную как задача коммивояжера. Имеется р городов, расстояния между которыми известны. Коммивояжер должен посетить все р городов по одному разу, вернувшись в тот, с которого начал. Требуется найти такой маршрут движения, при котором суммарное пройденное расстояние будет минимальным. Очевидно, что задача коммивояжера — это задача отыскания кратчайшего га- мильтонова цикла в полном графе. Можно предложить следующую простую схему решения задачи коммивояжера: сгенерировать все р! возможных перестановок вершин полного графа, подсчи- тать для каждой перестановки длину маршрута и выбрать из них кратчайший. Очевидно, такое вычисление потребует О(р!) шагов. Как известно, р! с ростом р растет быстрее, чем любой полином от р, и даже быстрее, чем 2Р (см. раздел 5.2). Таким образом, решение 'задачи коммивояжера описанным методом полного перебора оказывается практически неосуществимым даже для сравнительно небольших р. Более того, известно, что задача коммиво- яжера принадлежит к числу так называемых NP-полных задач, подробное об- суждение которых выходит за рамки этого учебника. Вкратце суть проблемы NP-полноты сводится следующему. В различных областях дискретной матема- тики, комбинаторики, логики и т. п. известно множество задач, принадлежащих к числу наиболее фундаментальных, для которых, несмотря на все усилия, не удалось найти алгоритмов решения, имеющих полиномиальную трудоемкость. Более того, если бы удалось отыскать эффективный алгоритм решения хотя бы одной из этих задач, то из этого немедленно следовало бы существование эффек- тивных алгоритмов для всех остальных задач данного класса. На этом основано общепринятое мнение, что таких алгоритмов не существует. ОТСТУПЛЕНИЕ----------------------------------------------------- Полезно сопоставить задачи отыскания эйлеровых и гамильтоновых циклов, рассмотрен- ные в этом и предыдущем разделах. Внешне формулировки этих задач очень похожи, однако они оказываются принципиально различными с точки зрения практического при- менения. Уже давно Эйлером получено просто проверяемое необходимое и достаточное условие существования в графе эйлерова цикла. Что касается гамильтоновых графов, то для них не известно необходимых и достаточных условий. На основе необходимого и до- сточного условия существования эйлерова цикла можно построить эффективные алгорит- мы отыскания такого цикла. В то же время задача проверки существования гамильтонова
268 Глава 10. Циклы цикла оказывается NP-полной (также как и задача коммивояжера). Далее, известно, что почти нет эйлеровых графов, и эффективный алгоритм отыскания эйлеровых циклов ред- ко оказывается применимым на практике. С другой стороны, можно показать, что почти все графы гамильтоновы, то есть 1йп 1^1 = 1 |G(p)l ’ где Н(р) — множество гамильтоновых графов с р вершинами, a G(p) — множество всех графов с р вершинами. Таким образом, задача отыскания гамильтонова цикла или экви- валентная задача коммивояжера являются практически востребованными, но для них не- известен (и, скорее всего, не существует) эффективный алгоритм решения. Комментарии Из вопросов, рассмотренных в этой главе, наибольшее внимание в литературе уделено задаче коммивояжера. Анализ различных подходов к ее решению см., например, в [И]. Алгоритм 10.1 описан в [14], в других источниках (например в [6]) можно найти другие варианты решения этой задачи. Упражнения 10.1. Доказать, что кодерево связного графа является максимальным подграфом, не содержащим коциклов. 10.2. Доказать, что эйлеров граф не имеет мостов. 10.3. Доказать, что если в связном графе G(V,E) Vu,v G V d(u) 4- d(v) p, to граф G гамильтонов.
ГЛАВА 11 Независимость и покрытия В этой главе рассматриваются некоторые известные задачи теории графов и ука- зываются связи между ними. Особое внимание уделяется обсуждению методов решения переборных задач на примере задачи отыскания максимального неза- висимого множества вершин. 11.1. Независимые и покрывающие множества Прежде всего введем определения и рассмотрим основные свойства независи- мых и покрывающих множеств вершин и ребер. Эти определения и свойства используются в последующих разделах. 11.1.1. Покрывающие множества вершин и ребер Говорят, что вершина покрывает инцидентные ей ребра, а ребро покрывает ин- цидентные ему вершины. Множество таких вершин, которые покрывают все ребра, называется вершинным покрытием. Наименьшее число вершин во всех вершинных покрытиях называ- ется числом вершинного покрытия и обозначается а0- Пример 1. Для полного графа а0(Кр) — р - 1. 2. Для полного двудольного графа oo(Km,n) = min(m, n). 3. Для вполне несвязного графа а0(Кр) = 0. 4. Для несвязного графа ao(Gi U G2) = ao(Gi) + ao(G2). Множество таких ребер, которые покрывают все вершины, называется реберным покрытием. Наименьшее число ребер во всех реберных покрытиях называется числом реберного покрытия и обозначается ад.
270 Глава 11. Независимость и покрытия ЗАМЕЧАНИЕ-----------------------------------—-----------—--------- Для графа с изолированными вершинами cki не определено. Пример 1. Для четного цикла аДК2п) = п, для нечетного цикла аДК2п+1) = n +1. 2. Для полного графа с четным числом вершин ai(K2n) = п, для полного графа с нечетным числом вершин аДКгп-и) = n + 1. 3. Для полного двудольного графа ai(K'rnjn) = max(m,n). 11.1.2. Независимые множества вершин и ребер Множество вершин называется независимым, если никакие две из них не смеж- ны. Наибольшее число вершин в независимом множестве вершин называется вершинным числом независимости и обозначается /30- Пример 1. Для полного графа До(Кр) = 1. 2. Для полного двудольного графа /3o(-Km,n) = max(m, n). 3. Для вполне несвязного графа До(/Ср) = р. 4. Для несвязного графа /30(Gi U G2) = /30(Gi) + 0o(G2). Множество ребер называется независимым, если никакие два из них не смежны. Наибольшее число ребер в независимом множестве ребер называется реберным числом независимости и обозначается /31. ЗАМЕЧАНИЕ--------------------------------------------------------- Независимое множество ребер называется также паросочетанием. Пример 1. Для четного цикла РДК2п} — п, для нечетного цикла /31 (К2п+г) = п — 1. 2. Для полного графа с четным числом вершин /31(К2п) = п, для полного графа с нечетным числом вершин /ЗДК2n+i) = n — 1. 3. Для полного двудольного графа /31 (/Ст,п) = min(m,n). 11.1.3. Связь чисел независимости и покрытий Приведенные примеры наводят на мысль, что числа независимости и покрытия связаны друг с другом и с количеством вершин р. ТЕОРЕМА Для любого нетривиального связного графа «о + До = Р = «1 + &
Т1.1. Независимые и покрывающие множества >71 Доказательство Покажем, что имеют место четыре неравенства, из которых следуют два требуе- мых равенства. «о +/3q > р : Пусть Мо — наименьшее вершинное покрытие, то есть |М0| = а0. Рассмотрим V\MQ. Тогда V\M0 — независимое множество, так как если бы в множестве V\M0 были смежные вершины, То Мо не было бы покрытием. Имеем |V \ Мо| /30, следовательно, р = |A1q| + |V \ Mq| cto 4- /?q. «о + A) p : Пусть No — наибольшее независимое множество вершин, то есть |7Vo| = /% Рассмотрим V \ 7V0. Тогда V\^o — вершинное покрытие, так как нет ребер, инцидентных только вершинам из No, стало быть, любое ребро инцидентно вершине (или вершинам) из V\M0. Имеем |V \ JVo| > oto, следовательно, р = |№| + |V \ No\ > /Зо 4- а0. ai + А > р: Пусть Му — наименьшее реберное покрытие, то есть |Ali| = Множество Му не содержит цепей длиной больше 2. Действитель- но, если бы в Му была цепь длиной 3, то среднее ребро этой цепи можно было .бы удалить из Му и это множество все равно осталось бы покрытием. Следовательно, Му состоит из звезд. (Звездой на- зывается граф, диаметр которого не превосходит двух, D(G) ^2.) Пусть этих звезд т. Имеем IMJ = 52ZU п,, где щ — число ребер в г-й звезде. Заметим, что звезда из п, ребер покрывает щ 4-1 верши- ну. Имеем: р — 52^г(пг +1) = то + £X,i ni = m+ l-^iI- Возьмем по одному ребру из каждой звезды и составим из них множество X. Тогда |Х| — т, множество X — независимое, то есть |Х| А- Следовательно, р = |Mi| + m = IMjI 4-|Х| «1 + А. «1 + А Р : Пусть Ny — наибольшее независимое множество ребер, то есть |М| = (Зу. Построим реберное покрытие Y следующим образом. Множество Ny покрывает 2|М| вершин. Добавим по одному ре- бру, инцидентному непокрытым р — 2|Д\ | вершинам, таких ребер р—2|№|. Тогда множество Y — реберное покрытие, то есть |У| < и |У| — |М| + р- 2|М| = р- |М|. Имеем: P = P-\Ny\ + \Ny\ = \Y\ + \Ny\^ay+/3y. □ ЗАМЕЧАНИЕ--------------------------------------------------- Условия связности и нетривиальное™ гарантируют, что все четыре инварианта определе- ны. Однако это условие является достаточным, но не является необходимым. Например, для графа Кп U Кп заключение теоремы остается справедливым, хотя условие не выпол- нено.
272 Глава 11. Независимость и покрытия ОТСТУПЛЕНИЕ------------------------------------------------------ Задача отыскания экстремальных независимых и покрывающих множеств возникает во многих практических случаях. Например, пусть есть множество процессов, использующих неразделяемые ресурсы. Соединим ребрами вершины, соответствующие процессам, кото- рым требуется один и тот же ресурс. Тогда (Зо будет определять количество возможных параллельных процессов. 11.2. Построение независимых множеств вершин Данный раздел фактически является вводным обзором методов решения пере- борных задач. Методы рассматриваются на примере задачи отыскания макси- мального независимого множества вершин графа. Данный обзор не претендует на полноту, но описание основополагающих идей и терминов в нем присутствует. 11.2.1. Постановка задачи отыскания наибольшего независимого множества вершин Задача отыскания наибольшего независимого множества вершин (и, тем самым, определения вершинного числа независимости /36) принадлежит к числу трудо- емких. Эту задачу можно поставить следующим образом. Пусть задан граф G(V,E). Найти такое множество вершин X, X с V, что w(X) = maxw(Y), где w(X): = |Х|, а £ : = {У С V | Vи, v € Y (u,v) Е} (см. раздел 2.7.5). Если бы семейство £ независимых множеств оказалось матроидом, то поставлен- ную задачу можно было бы решить жадным алгоритмом (алгоритм 2.2). Одна- ко семейство £ матроидом не является. Действительно, хотя аксиомы Мт. и М2 (см. подраздел 2.7.1) выполнены, так как пустое множество вершин независимо и всякое подмножество независимого множества независимо, но аксиома М3 не выполнена, как видно из сдедующего примера. Пример Рассмотрим полный двудольный граф Kn,n+i- Доли этого графа образуют (мак- симальные) независимые множества, и их мощности различаются на 1. Однако никакая вершина из большей доли не может быть добавлена к вершинам мень- шей доли с сохранением независимости.
11.2. Построение независимых множеств вершин 273 11 -2.2. Поиск с возвратами Даже если для решения задач, подобных поставленной в предыдущем разделе, не удается найти эффективного алгоритма, всегда остается возможность найти ре- шение «полным перебором» всех возможных вариантов, просто в силу конечно- сти числа возможностей. Например, наибольшее независимое множество можно найти по следующей схеме. Вход: граф G(V, Е). Выход: наибольшее независимое множество X. тп: = 0 { наилучшее известное значение /Зо } for Y е 2V do if Ye £&|У| >m then m := |Y|; X : = Y { наилучшее известное значение X } end if end for ЗАМЕЧАНИЕ------------------------------------------------------------ Для выполнения этого алгоритма потребуется О(2Р) шагов. ОТСТУПЛЕНИЕ------------------------------------------------------ Алгоритм, трудоемкость которого (число шагов) ограничена полиномом от характерного размера задачи, принято называть эффективным, в противоположность неэффективным алгоритмам, трудоемкость которых ограничена более быстро растущей функцией, напри- мер экспонентой. Таким образом, жадный алгоритм эффективен, а полный перебор — нет. При решении переборных задач большое значение имеет способ организации пе- ребора (в нашем случае — способ построения и последовательность перечисления множеств У). Наиболее популярным является следующий способ организации перебора, основанный на идее поиска в глубину и называемый поиском с возвра- тами. ЗАМЕЧАНИЕ--------------------------------------------------------------- Иногда употребляется термин бэктрекинг (от английского названия этого метода — backtracking). Идея поиска с возвратами состоит в следующем. Находясь в некоторой ситуа- ции, пробуем изменить ее в надежде найти решение. Если изменение не привело к успеху, то возвращаемся в исходную ситуацию (отсюда название «поиск с воз- вратами») и пробуем изменить ее другим образом, и так до тех пор, пока не будут исчерпаны все возможности. Для рассматриваемой задачи метод поиска с возвратами может быть реализован с помощью следующего рекурсивного алгоритма.
274 Глава 11. Независимость и покрытия Алгоритм 11.1. Поиск с возвратами Вход: граф G(V, Е). Выход: наибольшее независимое множество X. т: = 0 { наилучшее известное значение /Зц } BT(0, V) { вызов рекурсивной процедуры ВТ } Основная работа выполняется рекурсивной процедурой ВТ. Вход: S — текущее независимое множество вершин, Т — оставшиеся вершины графа. Выход: изменение глобальной переменной X, если текущее множество не может быть расширено (является максимальным). е: = false { признак расширяемости множества } for v G V do if S U {«} € £ then е: = true { множество можно расширить } BT(S U {ц},Т' \ Г*(и)) { пробуем добавить v } end if end for if e then if |S| > m then X := S-,m := |S| { наибольшее независимое множество } end if end if Обоснование По построению вершина и добавляется в множество S только при сохранении независимости расширенного множества. В алгоритме это обстоятельство указа- но в форме условия S U {«} € 8. Проверить сохранение условия независимости нетрудно, например, с помощью следующего цикла. f: = true { множество S независимое } for и е S do if (u, v) e E then f: = false; exit for { множество S U {v} зависимое } end if end for Этот цикл не включен в явном виде в рекурсивную процедуру ВТ, чтобы не загромождать основной текст и не затуманивать основную идею поиска с воз- вратами. Таким образом, множество S, а следовательно, и множество X — не- зависимые. В тот момент, когда множество S нельзя расширить (е = false), оно максимально по определению. Переменная т глобальна, поэтому среди всех мак- симальных независимых множеств в конце работы алгоритма X является наи- большим независимым множеством вершин. ’ □ 11.2.3. Улучшенный перебор Применение метода поиска с возвратами не гарантирует эффективности — тру- доемкость поиска с возвратами имеет тот же порядок, что и другие способы перебора (в худшем случае).
11.2. Построение независимых множеств вершин 275 Используя конкретную информацию о задаче, в некоторых случаях можно суще- ственно сократить трудоемкость выполнения каждого шага перебора или умень- шить количество перебираемых возможностей в среднем (при сохранении оцен- ки количества шагов в худшем случае). Такие приемы называются методами улучшения перебора. Например, может оказаться, что некоторые варианты за- ведомо не могут привести к решению, а потому их можно не рассматривать. ЗАМЕЧАНИЕ------------------------------------------------------------ Рекурсивная форма метода поиска с возвратами удобна для понимания, но не является самой эффективной. По сути, рекурсия здесь используется для сохранения контекста — то есть информации, характеризующей текущий рассматриваемый вариант. Если исполь- зовать другие методы сохранения контекста, то поиск с возвратами может быть реализован без явной рекурсии, а значит, более эффективно. Рассмотрим методы улучшения перебора на примере задачи отыскания всех мак- симальных независимых множеств вершин. Идея: начинаем с пустого множества и пополняем его вершинами р сохранением независимости (пока возможно). Пусть Sk — уже полученное множество из к вершин, Qk — множество вершин, которое можно добавить к Sk, то есть Sk nr(Qfc) = 0. Среди вершин Qk будем различать те, которые уже использовались для расширения Sk (обозначим ), и те, которые еще не использовались (<?£). Тогда общая схема нерекурсивной реализации поиска с возвратами будет состоять из следующих шагов. Шаг вперед от к к к + 1 состоит в выборе вершины х € Sk+i - 5к U {ж},. Qk+i= Qk ~ Qt+i = - (Г(®) и {®})- Шаг назад от к + 1 к к: Sk = Sk+i - {ж}, Qt = Qk - {4> Qk = Qk *-* {а:}‘ Если Sk — максимальное, то = 0. Если Q* / 0, то Sk было расширено раньше и не является максимальным. Таким образом, проверка максимальности задается следующим условием: =± = 0. Перебор можно улучшить, если заметить следующее. Пусть х € и Г(ж)riQj = 0. Эту вершину х никогда не удалить из Q^, так как из удаляются только вершины, смежные с Q%. Таким образом, существова- ние х, такого что х е и Г(ж) n = 0, является достаточным условием для возвращения. Кроме того, к < Р — 1-
276 Глава 11. Независимость и покрытия 11.2.4. Алгоритм построения максимальных независимых множеств вершин Приведенный ниже алгоритм, обоснование которого дано в предыдущем разделе, строит все максимальные независимые множества вершин заданного графа. Алгоритм 11.2. Построение максимальных независимых множеств Вход: граф G(V,E), заданный списками смежности Г[v] Выход: последовательность максимальных независимых множеств к: = 0 { количество элементов в текущем независимом множестве } 5[fc]: = 0 { S[fc] — независимое множество из к вершин } : = 0 {<?“[&] — множество вершин, использованных для расширения S[fe] } Q+ [fc]: = V { Q+ [fc] — множество вершин, которые можно использовать для расширения } Ml :{ шаг вперед } select v € { расширяющая вершина } + 1]: = S[fe] U {«} { расширенное множество } Q~ [fc + 1]: = Q~ [fc] \ Г[г>] { вершина v использована для расширения } Q+ [&+1]: = Q+ [fc] \ (Г[и] U{v}) { все вершины, смежные с v, не могут быть использованы для расширения } к: = к + 1 М2 : { проверка } for и € Q~ [fc] do if Г [it] П Q+[fc] = 0 then goto М3 { можно возвращаться } end if end for if Q+ [&] = 0 then if Q~ [fc] = 0 then yield S[fc] { множество S[fc] максимально } end if goto М3 { можно возвращаться } else goto Ml { можно идти вперед } end if М3 : { шаг назад } v: = last(S[fc]) { последний добавленный элемент } к: = к — 1 S[fe]: = S[A: + 1] — {«} Q~ [fc]: = Q~ [fc] U {«} { вершина v уже добавлялась } Q+[fc]: = Q+[fc]\M if fc = 0&Q+[fc] = 0 then stop { перебор завершен } else goto М2 { переход на проверку } end if
11.3. Доминирующие множества 277 Пример Известная задача о восьми ферзях (расставить на шахматной доске 8 ферзей так, чтобы они не били друг друга) является задачей об отыскании максимальных не- зависимых множеств. Действительно, достаточно представить доску в виде гра- фа с 64 вершинами (соответствующими клеткам доски), которые смежны, если клетки находятся на одной вертикали, горизонтали или диагонали. 11.3. Доминирующие множества Задача о наименьшем покрытии (сокращенно ЗНП) является примером общей экстремальной задачи, к которой прямо или косвенно сводятся многие практи- ческие задачи. Эта задача является классической, хорошо изучена и часто ис- пользуется в качестве теста для сравнения и оценки различных общих методов решения трудоемких задач. В этом разделе на основе рассмотрения понятия доминирующего множества ЗНП формулируется в различных вариантах, и приводятся сведения о связи ЗНП с другими задачами. 11.3.1. Определения Для орграфа G(V, Е) множество вершин S с V называется доминирующим мно- жеством, если S U Г(5) = V, то есть для любой вершины v € V либо v € S, либо существуют вершина s € S и ребро (s, v). Доминирующее множество называется минимальным, если его подмножество не является доминирующим. Доминирующее множество называется наименьшим, если число элементов в нем минимально. Пример Известная задача о пяти ферзях (расставить на шахматной доске 5 ферзей так, чтобы они били всю доску) является задачей об отыскании наименьших доми- нирующих множеств. 11.3.2. Доминирование и независимость Доминирование тесно связано с вершинной независимостью. ТЕОРЕМА Независимое множество вершин является максимальным тогда и только тогда, когда оно является доминирующим. Доказательство Необходимость. Пусть множество вершин S (S с V) - максимальное незави- симое. Допустим (от противного), что оно не доминирующее. Тогда существует вершина v, находящаяся на расстоянии больше 1 от всех вершин множества S.
278 Глава 11. Независимость и покрытия Эту вершину можно добавить к S с сохранением независимости, что противоре- чит максимальности. Достаточность. Пусть S — независимое доминирующее множество. Допустим (от противного), что оно не максимальное. Тогда существует вершина v, не смежная ни с одной из вершин множества S, то есть находящаяся на расстоянии боль- ше 1 от всех вершин множества S. Это противоречит тому, что множество S — доминирующее. □ Независимое доминирующее множество вершин называется ядром графа. 11.3.3. Задача о наименьшем покрытии Рассмотрим следующую задачу. Пусть каждой вершине сопоставлена некоторая цена. Требуется выбрать доминирующее множество с наименьшей суммарной це- ной. Эта задача называется задачей о наименьшем покрытии (сокращенно ЗНП). ЗНП является весьма общей задачей, к которой сводятся многие другие задачи. Пример 1. Задача о выборе переводчиков. Организации нужно нанять переводчиков для перевода с определенного множества языков. Каждый из имеющихся перевод- чиков владеет некоторыми иностранными языками и требует определенную зарплату. Требуется определить, каких переводчиков следует нанять, чтобы сумма расходов на зарплату была минимальной. 2. Задача о развозке. Поставщику нужно доставить товары своим потребителям. Имеется множество возможных маршрутов, каждый из которых позволяет об- служить определенное подмножество потребителей и требует определенных расходов. Требуется определить, какие маршруты следует использовать, что- бы все потребители были обслужены, а сумма транспортных расходов была минимальной. 11.3.4. Эквивалентные формулировки ЗНП ЗНП может быть сформулирована многими разными способами. 1. Пусть имеется конечное множество V = {t’i,..., vp} и семейство подмножеств этого множества Е = {£\,... ,ЕР}. Каждому подмножеству Е, приписан вес. Найти покрытие Е' (Е' с Е) наименьшего веса. ЗАМЕЧАНИЕ------------------------------------------------------- Из этой формулировки происходит название «задача о наименьшем покрытии».
11.3. Доминирующие множества 279 2. ЗНП можно сформулировать как задачу линейного программирования: р min CiXi £=1 при ограничениях р tijXj 1 (t = 1, . . . ,р), J = 1 где {1, если Ei € Е', О, в противном случае, {1, если Vi € Ei, О, в противном случае. 3. Дана булева матрица Т : array [l..p, l..p] of 0..1. Каждому столбцу приписан вес Cj. Найти такое множество столбцов минимальной стоимости, чтобы любая строка содержала единицу хотя бы в одном из выбранных столбцов. 11.3.5. Связь ЗНП с другими задачами Известно, что ЗНП относится к числу трудоемких задач, и для ее решения при- меняются переборные алгоритмы с теми или иными улучшениями. На рис. 11.1 приведена схема (см. [И]), показывающая связь ЗНП и некоторых других задач. На этой схеме стрелка от задачи А к задаче В означает, что решение задачи А влечет за собой решение задачи В.
280 (лава 11. Независимость и покрытия Комментарии Обсуждение переборных задач в этой главе носит в основном ознакомитель- ный характер. Для получения более точной и детальной информации следует обратиться к специальной литературе, прежде всего к фундаментальной кни- ге [4]. Алгоритм построения максимальных независимых множеств заимствован из [И]. Здесь этот алгоритм использован прежде всего в качестве примера для иллюстрации способов и особенностей решения переборных задач. Упражнения 11.1. Доказать, что а0 До- 11.2. Написать алгоритм построения всех клик графа. 11.3. Доказать, что наименьшее доминирующее множество является независи- мым.
ГЛАВА 12 Раскраска графов Задача раскрашивания графов, которая на первый взгляд кажется просто празд- ной головоломкой, имеет неожиданно широкое применение в программировании, особенно при решении фундаментальных теоретических проблем (см., напри- мер, [7D. 12.1. Хроматическое число Способ явного выражения хроматического числа через другие инварианты графа неизвестен. Известны только некоторые оценки, часть из которых приведена в данном разделе. Раскраской графа называется такое приписывание цветов (натуральных чисел) его вершинам, что никакие две смежные вершины не получают одинаковый цвет. Наименьшее возможное число цветов в раскраске называется хроматическим числом и обозначается x(G). Очевидно, что существует m-раскраска графа G для любого т в диапазоне x(G) т р. Множество вершин, покрашенных в один цвет, называется одноцветным классом. Одноцветные классы образуют независи- мые множества вершин, то есть никакие две вершины в одноцветном классе не смежны. Пример х(*р) = 1, х(Кр)=р, х{Кт^ = 2, Х(С2„) = 2, х(С2п+1) = з, х(Т) = 2, где Т — свободное дерево. ТЕОРЕМА x(G) <1 + A(G). Доказательство Индукция по р. База: р = 1 ==> x(G) = 1 & A(G) = 0. Пусть VG p(G) < р => x(G) A(G) + 1. Рассмотрим G: p(G) = р. Тогда, если v е V, то x(G — и) < Д(<7 — в) + 1 Д(в) + 1. Но d(v) Д(С), значит, хотя бы
282 Глава 12. Раскраска графов один цвет в Д((7) + 1 раскраске графа G - v свободен для v. Покрасив v в этот цвет, имеем Д(<7) + 1 раскраску G. □ ТЕОРЕМА p/fa(G) X(G) sC р - /30(С) + 1. Доказательство 1. Пусть х(Р) = п и V = Vi U • • • U Vn, где Ц — одноцветные классы. Ц — независимое множество вершин, значит, |Vi| Pa(G). Имеем: п р - 52 lVil nA»(G) => р/А> < х- i=i 2. Пусть S с V — наибольшее независимое множество, |S| = /?o(G). Тогда x(G - S) |V — S| = р — /30(G). Из n-раскраски G — S можно получить (n + 1)- раскраску G, так как все вершины из S можно покрасить в один новый цвет. Следовательно, X(G)^/(G-S) + I^p-/3O+'1. □ ТЕОРЕМА Пусть х: = x(G), х: = x(G). Тогда 2у/р^Х + Х^Р+Ъ Доказательство 1. Пусть x(G) = п, Vi,...,Vn — одноцветные классы, Pi: = |Уф Тогда п i=i следовательно, шах р; > р/п. г=1 Но Vi — независимые множества в G, следовательно, И — клики в G. Значит, X max. pi р/п. г=1 Имеем XX п Р/^ = р. 2. Известно, что среднее геометрическое не превосходит среднего арифметиче- ского: а + b г— Следовательно, х + X 2\/ХХ 2у/р.
12.2. Планарность 283 3. Докажем индукцией по р, что х + х р + 1. База: р = 1 => х — 1 & X = 1. Пусть х + X Р Для всех графов с р — 1 вершинами. Рассмотрим граф G с р вершинами и вершину v eV. Тогда, очевидно, x(G) < X<G - v) 4-1 & x(G) < x(G - v) + 1- Если x(G) < x(G - v) + 1 V x(G) < x(G - v) + 1, to X + X = X(G) + x(G) < x(G - v) + 1 + x(G - v) + 1 p + 2. Следовательно, x + X P + 1- Пусть теперь X(G) = X{G - v) + 1&X(G) = x(G - v) + 1. Положим d: = d(v) в графе G, тогда d = p—d—J. — степень v в графе G. Имеем d x(p ~ v)- Действительно, x(G) = x(.G - v) + 1 и, если бы d < x(G - v), то вершину v можно было бы раскрасить в любой из свободных x(G — v)—d цветов и получить x(G — и)-раскраску графа G. Аналогично, d = p — d — 1 x(G - v). Таким образом, X + X = X(G) + X(G) = = x(G ~ v) + 1 + x(G -v) + l^d+l+p-d-l + l= p+l. - — /p+lV _ 4. Имеем 2 y/xx < X + X P+ !' Следовательно, I —-—) XX- □ 12.2. Планарность Обсуждение планарности в этом разделе позволяет решить вторую историческую задачу из перечисленных в подразделе 7.1.1, а также подготавливает результаты, необходимые для доказательства теоремы о пяти красках. 12.2.1. Укладка графов Граф укладывается на Некоторой поверхности, если его можно нарисовать на этой поверхности так, чтобы ребра графа при этом не пересекались. Граф назы- вается планарным, если его можно уложить на плоскости. Плоский граф — это граф, уже уложенный на плоскости. Область, ограниченная ребрами в плоском графе, и не содержащая внутри себя вершин и ребер, называется гранью. Число граней плоского графа G обозначает- ся r(G). ЗАМЕЧАНИЕ-------------------------------------------------------- Внешняя часть плоскости также образует грань. Пример На рис. 12.1 показаны диаграммы планарного графа ТГ4 и его укладки на плос- кости. Этот граф имеет 4 грани.
284 Глава 12. Раскраска графов Рис. 12.1. Планарный граф и его укладка 12.2.2. Эйлерова характеристика Для графов, уложенных на некоторой поверхности, справедливо определенное соотношение между числом вершин, ребер и граней. Это соотношение называется эйлеровой характеристикой поверхности. ТЕОРЕМА (формула Эйлера) В связном планарном графе справедливо следующее: р — q + г = 2. Доказательство Индукция по q. База: q = 0 ==> р = 1 & г = 1. Пусть теорема верна для всех графов с q ребрами: р — q + г = 2. Добавим еще одно ребро. Если добавляемое ребро соединяет существующие вершины, то q' = q + 1, р' = р, г' = г + 1 и р1 — q' + г' = р — q — l+r+l=p— q + r = 2. Если добавляемое ребро соединяет существующую вершину с новой, то р' — р + 1, q' — q + 1, г' = г и р' - q1 + г' = = р + 1 — q — 1 + г = р — q + г = 2 □ СЛЕДСТВИЕ Если G — связный планарный граф (р > 3), то q Зр — 6. Доказательство Каждая грань ограничена по крайней мере тремя ребрами, каждое ребро ограни- чивает не более двух граней, отсюда Зг 2q. Имеем 2g 2 = р - q + r < р — q + — ==> Зр- 3g + 2q 6 ==> q Зр - 6. □ О СЛЕДСТВИЕ К5 и К3 3 непланарны. Доказательство 1. Рассмотрим К3. Имеем р = 5, q = 10. Если К5 планарен, то по предыдущему следствию q = р(р — 1)/2 — 10 Зр — 6 = 3-5 — 6 = 9 — противоречие. 2. Рассмотрим К33. Имеем р = 6, q = 9. В этом графе нет треугольников, значит, если этот граф планарен, то в его плоской укладке каждая грань, ограничена не менее чем четырьмя ребрами и, следовательно, 4r $ 2g или 2г <$д. По формуле Эйлера 6 — 9 + г = 2, откуда г = 5. Имеем 2r = 2- 5 = 10^g = 9 — противоречие. □
12.2. Планарность 285 ЗАМЕЧАНИЕ-------------------------------------------------------- Граф планарен тогда и только тогда, когда он не содержит в качестве подграфов ни Кз, ни Кз,з. Доказательство достаточности этого утверждения выходит за рамки данного курса. СЛЕДСТВИЕ В любом планарном графе существует вершина, степень которой не больше 5. Доказательство От противного. Пусть V v € V d(v) 6. Тогда 6р d(y) — 2q => Зр q, vev но q Зр — 6. Имеем: Зр Зр — 6, противоречие. □ ОТСТУПЛЕНИЕ---------------------------------------------------------- Эйлер вывел свою формулу, исследуя многогранники. Действительно, развертка много- гранника — это плоский граф, и обратно, связному плоскому графу соответствует много- гранник. Таким образом, теория графов имеет связи с самыми разными, на первый взгляд далекими, областями знания. 12.2.3. Теорема о пяти красках ТЕОРЕМА Всякий планарный граф можно раскрасить пятью красками. Доказательство Достаточно рассматривать связные графы, потому что п xdJGi) = maxx(Gi). i=l Индукция по р. База: если р < 5, то х Р 5. Пусть теорема верна для всех связных планарных графов с р вершинами. Рассмотрим граф G с р+1 вершиной. По третьему следствию к формуле Эйлера 3 v € V d(v) 5. По индукционному предположению x(G — v) 5. Нужно раскрасить вершину v. 1. Если d(v) < 5, то в 5-раскраске G — v существует цвет, свободный для v. 2. Если d(v) = 5 и для Г+(г>) использованы не все пять цветов, то в 5-раскраске G - v существует цвет, свободный для v. 3. Остался случай, когда d(v) = 5 и все пять цветов использованы (вершина Vi покрашена в цвет г, рис. 12.2). Пусть Gi3 — правильный подграф G - v, по- рожденный всеми вершинами, покрашенными в цвета 1 или 3 в 5-раскраске графа G — V. Если щ и v3 принадлежат разным компонентам связности гра- фа Слз, то в той компоненте, в которой находится «1, произведем перекраску
286 Глава 12. Раскраска графов 1 н 3. При этом получится 5-раскраска G — v, но цвет 1 будет свободен для у. В противном случае существует простая цепь, соединяющая гц и v:i и состоя-' щая из вершин, покрашенных в цвета 1 и 3. В этом случае v2 и v4 принадлежат разным компонентам связности подграфа (724 (так как граф G — планарный). Перекрасим вершины 2 н 4 в той компоненте связности графа С24, которой принадлежит v2, и получим 5-раскраску графа G—v, в которой цвет 2 свободен ДЛЯ V. □ Рис. 12.2. Иллюстрация к доказательству теоремы о пяти красках 12.3. Алгоритмы раскрашивания В этом разделе на примере алгоритмов раскрашивания графов вводится понятие приближенного алгоритма в более широком смысле по сравнению с тем, кото- рый обычно подразумевается в вычислительной математике и при проведении численных расчетов на ЭВМ. 12.3.1. Точный алгоритм раскрашивания Рассмотрим следующую схему рекурсивной процедуры Р: 1. Выбрать в графе G некоторое максимальное независимое множество вершин S. 2. Покрасить вершины множества S в очередной цвет. 3. Применить процедуру Р к графу G — S. Вход: граф G(V,E), номер свободного цвета г. Выход: раскраска, заданная массивом C[V], — номера цветов, приписанные вершинам. if V = 0 then return { раскраска закончена } end if S: — Selectmax(G) {S — максимальное независимое множество } C[S]: = i { раскрашиваем вершины множества S в цвет г } P(G — S, i + 1) { рекурсивный вызов }
12.3. Алгоритмы раскрашивания 287 ЗАМЕЧАНИЕ----------------------—-----—--------- Функция Selectmax может быть реализована, например, алгоритмом 11.2.4. ТЕОРЕМА Если граф G к-раскрашиваемый, то существует такая последова- тельность выборов множества S на шаге 1 процедуры Р, что применение проце- дуры Р к графу G построит не более чем к-раскраску графа G. Доказательство Пусть имеется некоторая fc-раскраска графа G(V, Е). Перестроим ее в не более чем fc-раскраску, которая может быть получена процедурой Р. Пусть Ц с V — множество вершин в данной fc-раскраске, покрашенных в цвет 1. Множество Vi — независимое, но, может быть, не максимальное. Рассмотрим множество V/, та- кое что Vi U Vi' — максимальное независимое множество (может оказаться, что Vi = 0). Вершины из Vi не смежны с Vi, значит, вершины из V/ можно перекра- сить в цвет 1. Пусть далее V2 с V\(Vi UV/) — множество вершин, покрашенных в цвет 2. Аналогично рассмотрим множество V2, такое что V2UV2' — максималь- ное независимое в G\(Vi UVi'), покрасим вершины V2UV2 в цвет 2 и т. д. Всего в исходной раскраске было к независимых множеств. При перекраске их число не возрастет (но может уменьшиться, если x(G) < к). На каждом шаге алгоритма рассматривается одно из множеств, следовательно, процесс закончится. □ 12.3.2. Приближенный алгоритм последовательного раскрашивания В предыдущем подразделе алгоритм точного раскрашивания был построен на основе алгоритма выделения максимальных независимых множеств вершин, ко- торый имеет переборный характер. Таким образом, алгоритм точного раскраши- вания также имеет переборный характер. В таких случаях целесообразно рас- сматривать приближенные алгоритмы, которые не всегда находят точное реше- ние задачи (иногда они находят только приближение к нему, и мы не можем знать этого заранее), но зато достаточно эффективны. Рассмотрим следующий алгоритм последовательного раскрашивания. Алгоритм 12.1. Алгоритм последовательного раскрашивания Вход: граф G. Выход: раскраска графа — массив С : array [l..p] of 1..р. for v е V do С [и]: = 0 { все не раскрашены } end for for v G V do A: ={1,..., p} { все цвета } for и € Г+(к) do A: = A \ {C[u]} { занятые для v цвета } end for
288 Глава 12. Раскраска графов C[v]: = min А { минимальный свободный цвет } end for ЗАМЕЧАНИЕ--------------------------------------------------------------- Таким образом, красить вершины необходимо последовательно, выбирая среди допусти- мых цветов минимальный. Обоснование В основном цикле рассматриваются все вершины, и каждая из них получает допустимую раскраску, таким образом, процедура строит допустимую раскраску. □ 12.3.3. Улучшенный алгоритм последовательного раскрашивания Следующий алгоритм также строит допустимую раскраску, применяя такую эв- ристику: начинать раскрашивать следует с вершины наибольшей степени, по- скольку, если их раскрашивать в конце процесса, то более вероятно, что для них не найдется свободного цвета и придется задействовать еще один цвет. Алгоритм 12.2. Улучшенный алгоритм последовательного раскрашивания Вход: граф G. Выход: раскраска графа — массив С : array [l..p] of 1..р. Sort (у) { упорядочить вершины по невозрастанию степени } с: = 1 { первый цвет } for v G V do С|р]: = 0 { все не раскрашены } end for while V / 0 do for v € V do for и € Г+(г>) do if C[u] = c then next for v { вершину v нельзя покрасить в цвет с } end if end for C[i>]: — с { красим вершину v в цвет с } V: = V \ {v} { и удаляем ее из рассмотрения } end for с: = с + 1 { следующий цвет } end while Обоснование Заметим, что данный алгоритм отличается от предыдущего тем, что основной цикл идет не по вершинам, а по цветам: сначала все что можно красим в цвет 1, затем в оставшемся красим все что можно в цвет 2 и т. д. В остальном алго- ритмы аналогичны, и данный алгоритм заканчивает свою работу построением допустимой раскраски по тем же причинам, что и предыдущий. □
Упражнения 289 Комментарии Центральный результат этой главы — теорема о пяти красках — изложен по книге [23]. Алгоритмы раскрашивания изложены по книге [И], в которой мож- но найти их более детальное и подробное обсуждение. Различные применения задачи о раскраске графов в программировании и смежные вопросы освещены в [5]. Упражнения 12.1. Доказать, что X(G(V,E)) ^1+ max 8(G'(V', Е’)). 12.2. Доказать, что если в планарном графе каждая грань есть Сп, то п(р - 2) 4 п-2 ' 12.3. Построить примеры графов, для которых алгоритмы последовательного раскрашивания строят не минимальную раскраску.
Литература 1. А. Ахо, Дж. Хопкрофт, Дж. Ульман, Построение и анализ вычислительных алгоритмов, Мир, 1979. 2. К. Берж, Теория графов и ее применения, Изд. иностр, лит., 1962. 3. Д. А. Владимиров, Булевы алгебры, Наука, 1969. 4. М. Гэри, Д. Джонсон, Вычислительные машины и труднорешаемые задачи, Мир, 1982. 5. В. А. Евстигнеев, Применение теории графов в программировании, Наука, 1985. 6. В. А. Емеличев, О. И. Мельников, В. И. Сарванов, Р. И. Тышкевич, Лекции по теории графов, Наука, 1990. 7. А. П. Ершов, Введение в теоретическое программирование, Наука, 1977. 8. Д. Кнут, Искусство программирования для ЭВМ, т. 1, Мир, 1977. 9. Д. Кнут, Искусство программирования для ЭВМ, т. 2, Мир, 1977. 10. П. Кон, Универсальная алгебра, Мир, 1968. И. Н. Кристофидес, Теория графов, алгоритмический подход, Мир, 1978. 12. В. Кук, Г. Бейз, Компьютерная математика, Наука, 1990. 13. С. С. Лавров, Л. И. Гончарова, Автоматическая обработка данных, хранение информации в памяти ЭВМ, Наука, 1971. 14. В. Липский, Комбинаторика для программистов, Мир, 1988. 15. Э. Мендельсон, Введение в математическую логику, Наука, 1984. 16. В. И. Нечаев, Элементы криптографии. Основы теории защиты информации, Высшая школа, 1999. 17. Дискретная математика и математические вопросы кибернетики. Под ред. С. В. Яблонского и О. Б. Лупанова, Наука, 1974. 18. И. В. Романовский, Дискретный анализ, Невский диалект, 1999. 19. В. Н. Сачков, Введение в комбинаторные методы дискретной математики, Наука, 1977. 20. В. Н. Сачков, Введение в комбинаторные методы дискретной математики, Наука, 1982.
Литература 291 21. Р. Уилсон, Введение в теорию графов, Мир, 1977. 22. Э. Фрид, Элементарное введение в абстрактную алгебру, Мир, 1979. 23. Ф. Харари, Теория графов, Мир, 1973. 24. Ч. Чень, Р. Ли, Математическая логика и автоматическое доказательство те- орем, Наука, 1983. 25. С. В. Яблонский, Введение в дискретную математику, Наука, 1986.
Алфавитный указатель А Автоморфизм, 55 Адекватность формальной теории, 107 Азбука Морзе, 165 Аксиома логическая, 105 нелогическая, 105 собственная, .105 формальной теории, 105 Аксиоматизируемость алгебраической системы, 107 конечная, 125 Алгебра, 52 S-алгебра, 53 Линденбаума-Тарского, 86 булева, 70 булевых функций, 86 высказываний, 103 конечно-порожденная, 53 многоосновная, 52 подмножеств, 25, 52 термов свободная, 53 универсальная, 52 Алгоритм Грея, 28 Дейкстры, 230 Краскала, 257 Лемпела—Зива, 179 Уоршалла, 48 Фано, 167 Флойда, 229 Хаффмена, 170 бинарного поиска, 248 выделения компонент сильной связности, 227 вычисления СДНФ, 91 генерации перестановок, 142 Алгоритм (продолжение) генерации подмножеств, 147 жадный, 75 интерпретации, 82 линейный, 75 метода резолюций, 132 нахождения максимального потока, 223 неэффективный, 273 обхода бинарного дерева, 245 поиска в глубину, 203 в ширину, 203 поиска с возвратами, 273 последовательного раскрашивания, 287 последовательного раскрашивания (улучшенный), 288 построения СДНФ, 90 построения кратчайшего остова, 256 построения эйлерова цикла, 264 приближенный, 287 слияния, 29 топологической сортировки, 46 унификации, 109 эффективный, 273 Алфавит, 161 формальной теории, 105 Аргумент функции, 38 Арифметика двоичная, 63 Ассоциативность объединения, 25 пересечения, 25 Б База матроида, 73 Базис, 82 векторного пространства, 66 матроида, 73
Алфавитный указатель 293 Биграф, 197 Бином Ньютона, 145 Блок графа, 212 разбиения, 148 Брат узла, 240 Буква, 161 Булеан, 25 Бэктрекинг, 273 Грань (продолжение) графа, 283 нижняя, 69 решетки верхняя, 68 нижняя, 68 Граф, 191 fc-связный, 214 Герца, 227 В Валентность вершины, 194 Вектор, 64 Векторное пространство конечномерное, 67 Величина потока, 221 Вершина висячая, 195 графа, 191 изолированная, 195 концевая, 195 покрывающая, 269 Вес дуги, 228 Ветвь ордерева, 240 Включение множеств, 22 Вхождение определяющее, 17 переменной свободное, 119 связанное, 119 Выводимость, 106 непосредственная, 106 Выполнимость формулы, 106, 121 Высказывание простое, 101 Высота дерева, 240 Вычет, 183 ациклический, 196, 234 вполне несвязный, 197 гамильтонов, 266 двудольный, 197 древовидный, 234 нагруженный, 192 несвязный, 197 ориентированный, 192 планарный, 283 плоский, 283 полный, 197 полный двудольный, 197 полуэйлеров, 263 помеченный, 192 регулярный, 194 с петлями, 192 связный, 197, 210 субциклический, 235 тривиальный, 197 четный, 197 эйлеров, 263 Группа, 59 абелева, 60, 125 коммутативная, 60 периодическая, 125 полная, 125 порядка п, 125 г симметрическая, 140 Гамма шифра, 182 Геодезическая, 196 Гиперграф, 192 Гипердуга, 192 Гипотеза, 106 Гомоморфизм, 54 Граница верхняя, 69 нижняя, 69 Грань верхняя, 69 д Декодирование, 160 Делитель нуля, 62 левый, 62 правый, 62 Дерево, 234 АВЛ-дерево, 254 бинарное, 242 выровненное, 253 корневое, 238 ориентированное, 238
294 Алфавитный указатель Дерево {продолжение) подровненное, 254 прошитое, 245 сбалансированное, 254 свободное, 234 сортировки, 247 упорядоченное, 241 Дешифрация, 181 Дешифрование, 181 Диаграмма Эйлера, 23 графа, 192 коммутативная, 55 Диаметр графа, 196 Дивергенция, 221 Дистрибутивность объединения относительно пересечения, 25 пересечения относительно объединения, 25 Длина дуги, 228 кодирования, 166 маршрута, 196 пути, 228 слова, 161 Добавление вершины, 200 ребра, 200 Доказательство теорем автоматическое, 127 Доля, 197 Дополнение, 68 графа, 199 множества, 23 Достижимость вершины, 206 Дуга, 192 Задача {продолжение) Штейнера, 258 комбинаторная, 135 коммивояжера, 267 о Кенигсбергских мостах, 190 о восьми ферзях, 277 о выборе переводчиков, 278 о наименьшем покрытии, 278 о пяти ферзях, 277 о развозке, 278 о свадьбах, 218 о трех домах и трех колодцах, 190 о четырех красках, 190 Заключение правила вывода, 106 Законы де Моргана, 25 Замена переменной, 58 линейная, 78 Замыкание, 94 множества, 53 отношения, 47 формулы, 122 Запись, 246 инфиксная, 34, 51 префиксная, 38 Зашифровка, 181 Звезда, 271 Значение истинностное, 101 функции, 38 И Идемпотентность объединения, 25 пересечения, 25 Измельчение разбиения, 148 Изоморфизм, 55 Е Единица аддитивная, 64 моноида, 58 мультипликативная, 64 решетки, 68 алгебр, 56 графов, 193 Инвариант графа, 193 Инверсия, 141 Инволютивность дополнения, 25 Интерпретация 3 Задача NP-полная, 267 Рамсея, 209 исчисления предикатов, 121 представления, 229 формальной теории, 106 формулы, 102 Инцидентность, 191
Алфавитный указатель 295 Источник, 199 Исчисление высказываний, 108 предикатов, 119 высшего порядка, 121 первого порядка, 119, 121 прикладное, 121 с равенством, 124 чистое, 119, 121 К Канал двоичный симметричный, 174 Квантор всеобщности, 119 существования, 119 Класс замкнутый, 94 множеств, 20 одноцветный, 281 полный, 96 эквивалентности, 42 Клика, 197 Ключ ассоциативной памяти, 246 шифра, 181 Код Хэмминга, 175 сообщения, 160 элементарный, 161 Кодерево, 261 Кодирование, 160 ш-ичное, 160 алфавитное, 161 двоично-десятичное, 161 двоичное, 160 оптимальное, 167 побуквенное, 161 помехоустойчивое, 173 равномерное, 167 с исправлением ошибок, 173 с минимальной избыточностью, 167 самокорректирующееся, 173 Коллизия, 247 Кольцо, 61 коммутативное, 61 с единицей, 61 Коммутативность объединения, 25 пересечения, 25 Композиция отношений, 34 подстановок, 58 Компонента связности, 197 сильной связности, 226 Конденсация орграфа, 227 Конец цепи, 195 Конечноместность, 52 Константа предметная, 119 Конструктивизм, 22 Контекст, 275 Контур, 196 Конфигурация комбинаторная, 135 Корень дерева, 238 Кортеж, 34 Коцикл, 260 Коэффициент биномиальный, 145 сжатия, 177 Криптография, 181 Криптостойкость, 181 Л Лес, 234 Линейная комбинация, 65, 261 Лист дерева, 240 Литерал, 120 контрарный, 130 Логические связки, 101 М Маршрут, 195 замкнутый, 195 открытый, 195 Массив дуг, 203 ребер, 203 Матрица инциденций, 202 смежности, 201 Матроид, 71 линейно-независимых множеств векторов, 77 разбиений, 77
296 Алфавитный указатель Матроид (продолжение) свободный, 77 трансверсалей, 77 Медиана множества, 167 Метатеоремы, 106 Метод пузырька, 141 Метод резолюций, 128 Метрика, 174 Множество, 20 аксиом независимое, 107 бесконечное, 21 вершин независимое, 270 разделяющее, 215 вполне упорядоченное, 45 доминирующее, 2П зависимое, 71, 261 задание перечислением элементов, 21 порождающей процедурой, 21 характеристическим предикатом, 21 конечное, 21 линейно зависимое, 65 линейно независимое, 65 минимальное, 277 наименьшее, 277 независимые, 71 несущее, 52 основное, 52 пометок, 192 порождающее, 66 пустое, 20 разрезов независимое, 261 ребер независимое, 218, 270 разделяющее, 215 смежности, 191 универсальное, 20 циклов независимое, 261 частично упорядоченное, 45 Модель, 52 множества формул, 107, 122 формальной теории, 107 Моноид, 58 Мономорфизм, 55 Мост, 212 Мощность множества, 23 Мультиграф, 192 Н Надмножество, 22 Начало слова, 161 собственное, 161 Неподвижная точка, 158 Непротиворечивость семантическая, 107 формальная, 107 Неравенство Макмиллана, 163 треугольника, 231 Носитель, 52 интерпретации, 121 Нуль группы, 60 решетки, 68 Нуль-вектор, 64 О Область действия квантора, 120 значений функции, 39 интерпретации, 106 определения функции, 39 целостности, 62 Образ, 40 Объединение графов, 199 множеств, 23 Окончание слова, 161 собственное, 161 Оператор возврата, 41 структурного перехода, 92 Операция п-арная, 51 п-местная, 51 ассоциативная, 54 главная (внешняя), 82 дистрибутивная слева, 54 справа, 54 идемпотентная, 54 коммутативная, 54 конкатенации, 57
Алфавитный указатель 297 Орграф, 192 направленный, 199 Ордерево, 238 Основа, 52 Остов, 256 кратчайший, 256 Отец узла, 240 Отношение п-арное, 34 «-местное, 34 антирефлексивное, 36 антисимметричное, 36 бинарное, 34 дополнительное, 34 линейное, 36 на множестве, 34 обратное, 34 однозначное, 38 полное, 36 порядка, 45 алфавитного, 50 антилексикографического, 142 лексикографического, 50, 142 линейного, 45 нестрогого, 45 полного, 45 строгого, 45 частичного, 45 рефлексивное, 36 симметричное, 36 сравнимости чисел, 183 тождественное, 34 транзитивное, 36 универсальное, 34 функциональное, 38 эквивалентности, 42 П Память ассоциативная, 246 Парадокс Рассела, 22 Паросочетание, 218, 270 совершенное, 218 Переменная несущественная, 80 предметная, 119 пропозициональная, 101, 108 существенная, 80 фиктивная, 80 Пересечение множеств, 23 Переход к прообразам, 40 Петля, 192 Побочный эффект, 83 Поглощение, 25, 54 Подалгебра, 52 Подграф, 194 остовной, 194 остовный, 256 правильный, 194 собственный, 194 Поддерево, 239 Подмножество, 22 замкнутое, 52 независимое максимальное, 72 собственное, 22 Подстановка, 58, 139 обратная, 139 тождественная, 139 Подформула, 82 Поиск бинарный, 248 в глубину, 204 в ширину, 204 двоичный, 248 полнотекстовый, 178 Покрытие, 24 вершинное, 269 реберное, 269 Поле, 62 действительных чисел, 52 упорядоченное, 78 Поле рациональных чисел, 52 Полином Жегалкина, 96 Полнота системы булевых функций, 96 формальной теории, 107 Полный перебор, 267 Полугруппа, 57 свободная, 57 циклическая, 57 Полуразрешимость формальной теории, 108 Полустепень захода, 195 исхода, 195 Польская запись, 244 обратная, 245
298 Алфавитный указатель Порядок установленный, 91 Постфикс, 161 Посылка правила вывода, 106 Поток, 221 Потомок узла, 240 Правило введения импликации, 112 вывода производное, 112 формальной теории, 105 замены, 85 отделения, 108 подстановки, 85 резолюции, 130 сечения, ИЗ склеивания/расщепления, 92 транзитивности, ИЗ Предикат, 119 п-арный, 119 п-местный, 119 Предложение, 128 резольвируемое, 130 родительское, 130 Преобразование эквивалентное, 92 Префикс, 161 Приведение подобных, 93 Принадлежность элемента множеству, 20 Принцип включения и исключения, 152 Произведение декартово, 33 подстановок, 139 прямое, 33 алгебр, 78 Прообраз, 40 Пропускная способность дуги, 221 разреза, 221 Пространство векторное, 64 Протаскивание отрицаний, 93, 129 Противоречие, 102 Псевдограф, 192 Путь, 196 кратчайший, 228 Р Равенство множеств, 23 упорядоченных пар, 33 Равномощность множеств, 23 Разбиение, 24 Разделение связанных переменных, 129 Размерность векторного пространства, 67 Размножение вершины, 200 Разность множеств, 23 симметрическая, 23 Разрез, 215, 260 простой, 260 фундаментальный, 261 Разрешимость класса формул, 90 формальной теории, 108 Разряд информационный, 176 контрольный, 176 Ранг коциклический, 261 множества, 73 циклический, 261 Раскраска графа, 281 Раскрытие скобок, 93 Расстояние, 174, 196 Хэмминга, 174 кодовое, 174 Расшифровка, 181 Расшифровывание, 181 Расщепление, 92 переменных, 93 Ребро графа, 191 кратное, 192 покрывающее, 269 Резольвента, 130 Решетка, 67 дистрибутивная, 67 ограниченная, 68 с дополнением, 68 Родитель узла, 240 С Связанность вершин, 197 Связка логическая, 108 Связность вершинная, 214 графа односторонняя, 226 сильная, 226
Алфавитный указатель 299 Связность (продолжение) орграфа слабая, 226 реберная, 214 Семейство дизъюнктное, 24 множеств, 20 Сеть, 199 Сжатие, 177 адаптивное, 179 Сигнатура, 52 формальной теории, 105 Система образующих, 53 различных представителей, 218 разрезов фундаментальная, 261 циклов фундаментальная, 261 Скаляр, 64 Склеивание, 92 Сколемизация, 129 Следование логическое, 103, 107, 123 Словарь, 178 Слово, 161, 178 пустое, 161 Сложность временная, 135 по времени, 135 по памяти, 135 емкостная, 135 Смежность вершин, 191 ребер, 191 Смешанные вычисления, 83 Соединение графов, 199 Сообщение, 160 шифрованное, 181 Соотношения определяющие, 57 , Сортировка формулы, 93 Список смежности, 202 Сравнение по модулю, 183 Степень вершины, 194 множества, 33 отношения, 35 Сток, 199 Стратегия метода резолюций, 133 Строение алгебры, 54 формулы, 85 Структура алгебраическая, 52 Стягивание подграфа, 200 Сужение функции, 39 Схема аксиом, 105, 108 кодирования, 161 правил вывода, 108 префиксная, 162 разделимая, 162 Сын узла, 240 Т Таблица истинности, 79 кодов, 161 расстановки, 247 хэш, 247 Тавтология, 102, 107 Тайнопись, 181 Теорема формальной теории, 106 Теория групп, 124 равенства, 123 формальная, 105 формальной арифметики, 124 Терм, 53, 119 свободный для переменной в формуле, 120 Тип, 52 Тождество Коши, 146 Точка сочленения, 211 Трансверсаль, 218 частичная, 77 Транспозиция, 140 Треугольник Паскаля, 146 Турнир, 199 У Удаление вершины, 200 ребра, 200 Узел, 192 Укладка графа, 283 Улучшение перебора, 275 Умножение вектора на скаляр, 64 Универсум, 20 Унификатор, 109 наиболее общий, 109 общий, 109
300 Алфавитный указатель Упаковка, 177 Упорядоченная пара, 33 Уровень узла, 240 Ф Фактор-граф, 227 Фактормножество, 43 Финитарность, 52 Форма дизъюнктивная, 93 нормальная, 90 совершенная нормальная дизъюнктивная, 89 конъюнктивная, 90 Формализуемость алгебраической системы, 107 Формула Кэли, 259 Стирлинга, 139 бескванторная, 123 в предваренной форме, 123 выполнимая, 102 замкнутая, 120 истинная, 122 ложная, 122 над базисом, 82 невыполнимая, 102 общезначимая, 102, 107, 122 открытая, 122 пропозициональная, 101 противоречивая, 107 пустая, 128 равносильная, 84 унифицируемая, 109 формальной теории, 105 Функтор, 119 Функция, 38 п аргументов, 39 п-местная, 39 Булева, 79 Эйлера, 184 алгебры логики, 79 биективная, 39 весовая, 74 взаимнооднозначная, 39 двойственная, 86 индуцированная, 40 инъективная, 39 монотонная, 47 Функция {продолжение) обратная, 39 отождествления, 44 производящая, 156 самодвойственная, 87 строго монотонная, 47 сюръективная, 39 тотальная, 39 характеристическая, 38 хэш, 247 частичная, 39 X Хорда, 261 ц Цена кодирования, 166 Цепочка множеств, 137 полная, 137 Цепь, 195 аугментальная, 223 вершинно-непересекающаяся, 215 простая, 195 реберно-непересекающаяся, 215 эйлерова, 263 Цикл, 140, 196 гамильтонов, 266 простой, 196 фундаментальный, 261 эйлеров, 263 Цифровая подпись, 187 Ч Частный случай набора формул, 109 наборов формул совместный, 109 совместный, 109 формулы, 109 Число Белла, 150 Стирлинга второго рода, 149 Стирлинга первого рода, .150 Фибоначчи, 158 вершинного покрытия, 269 вершинное независимости, 270 вещественное, 20 взаимно простое, 184
Алфавитный указатель Число (продолжение) инверсий, 141 коцикломатическое, 261 натуральное, 20, 53 перестановок, 136 простое, 20 псевдослучайное, 181 размещений, 135 размещений без повторений, 136 реберного покрытия, 269 реберное независимости, 270 сочетаний, 137 сочетаний с повторениями, 138 хроматическое, 281 целое, 53 цикломатическое, 261 четное, 56 Ш Ширина ветвления, 259 Шифр, 181 надежный, 181 раскрытие, 181 с открытым ключом, 183 симметричный, 182 Шифрование, 181 Шифровка, 181
301 э Эйлерова характеристика, 284 Эквивалентность логическая, 103, 123 Электронная подпись, 187 Элемент минимальный, 45 множества, 20 обратный, 59 Элиминация импликации, 129 кванторов всеобщности, 129 кванторов существования, 129 конъюнкции, 129 операций, 93 Эндоморфизм, 55 Эпиморфизм, 55 Эпиоморфизм, 55 Я Ядро графа, 278 отношения, 35 функции, 44 Язык формальной теории, 105 Ярус, 196 дерева, 240