
- •Введение
- •1. Элементы теории множеств
- •1.1.Понятие множества.
- •1.2. Способы задания множеств.
- •1.3. Свойства множеств.
- •1.4. Конечные и бесконечные множества.
- •1.5. Подмножества.
- •1.6. Множество как абстракция.
- •1.7. Операции над множествами.
- •1.8.Декартово произведение множеств
- •1.9. Контрольные задания
- •2. Отношения
- •2.1. Общие положения
- •2.2. Задание отношений.
- •2.3. Виды отношений.
- •2.3.1. Рефлективность.
- •2.3.2. Симметричность.
- •2.3.3. Транзитивность.
- •2.4. Отношение эквивалентности
- •2.5. Функция.
- •2.6. Отношение как базовое понятие в реляционных
- •2.7. Контрольные задания
- •3. Элементы алгебры логики
- •3.1. Силлогизмы Аристотеля.
- •3.2. Высказывания.
- •3.3. Исчисление высказываний и
- •3.4. Функции алгебры логики
- •3.5. Равносильности алгебры логики
- •3.6. Одна логическая задача
- •3.7. Реализация функций в элементных базисах
- •3.9. Совершенная конъюнктивная нормальная форма
- •3.10. Реализация операции суммирования в компьютере
- •3.11. Контрольные задания
- •4. Элементы теории графов
- •4.1. История возникновения
- •4.2. Основные понятия
- •4.3. Матрицы графа
- •4.4. Деревья
- •4.5. Раскраска
- •5. Элементы теории алгоритмов
- •5.1. Интуитивное понятие алгоритма
- •5.2. Свойства алгоритмов
- •5.3. Вычислительные и комбинаторные алгоритмы
- •5.5. Асимптотические оценки сложности алгоритма
- •Порядки сложности алгоритма
- •5.6. Комбинаторный взрыв
- •6. Полиномиальные алгоритмы
- •6.1. Построение минимального остовного дерева.
- •6.1.1. Жадный алгоритм
- •6.1.2. Алгоритм Прима
- •6.2. Контрольные задания
- •7. Эвристические алгоритмы
- •7.1. Алгоритм последовательной раскраски
- •7.2. Контрольные задания
- •8. Сетевое планирование
- •8.1. Основные понятия
- •8.2 Параметры сетевого планирования
- •8.3. Вычисление параметров сетевого графика
- •8.4. Контрольные задания
- •9. Элементы абстрактной теории автоматов
- •9.1. Определение абстрактного автомата
- •9.2. Методы задания автоматов
- •9.3. Связь между моделями Мили и Мура.
- •9.4.1. Преобразование автомата Мура в автомат Мили
- •9.4.2. Преобразование автомата Мили в автомат Мура
- •9.5. Контрольные задания
- •10. Уточнение понятия алгоритма
- •10.1. Машина Тьюринга
- •Для каждого алгоритма u из класса к1 существует равносильный ему алгоритм l из класса к2.
- •10.2. Нормальный алгоритм Маркова
5.6. Комбинаторный взрыв
Не так много алгоритмов имеют оценку сложности выше полиномиальной. Оценки сложности у большинства комбинаторных алгоритмов относятся ко второму классу.
Для них время решения Т как функция от размерности задачи T=f(n) имеет характер, показанный на рисунке. До какого-то критического значения nкр время счета нарастает медленно, а затем следует резкий скачок.
Т
0 nкр n
Такое явление называют комбинаторным взрывом. От него не спасает самый быстродействующий компьютер. Для каждой отдельной задачи значение nкр может сдвигаться в ту или другую сторону.
Оно зависит от всех факторов, перечисленных в начале § 5.5. Но рано или поздно при увеличении размерности задачи время решения резко возрастет, и наступит явление комбинаторного взрыва.
Возможность комбинаторного взрыва – это основная опасность, которую следует учитывать при выборе метода решения комбинаторной задачи.
6. Полиномиальные алгоритмы
Полиномиальность алгоритма чаще всего связана с тем, что на дереве перебора выделено поддерево, для которого доказано, что оно содержит оптимальное решение. Доказательства полиномиальности алгоритмов в настоящем пособии не приводится. Их можно посмотреть в рекомендуемой литературе.
К одной из немногочисленных комбинаторных задач, имеющих полиномиальный алгоритм решения, относится задача построения минимального остовного дерева.
6.1. Построение минимального остовного дерева.
Дан взвешенный граф G(X, U, W), |X|=n, |U|=m, |W|=m.
Рассмотрим два алгоритма построения минимального остовного дерева.
6.1.1. Жадный алгоритм
Положить k=1.
2. Выбрать ребро с минимальным весом и включить его в дерево Т.
3. Если k<n-1, то перейти к п.4, иначе – к п.6.
4. Из оставшихся ребер выбрать ребро с минимальным весом и включить его в дерево Т, если оно не образует цикла с построенной частью.
5. Положить k=k+1. Перейти к п.3.
6. Конец алгоритма.
Пример. Рассмотрим на рис. 6.2а связный взвешенный граф G(X, U, W), |X|=n=6, |U|=m=9, |W|=m=9.
Процесс построения минимального остовного дерева при помощи жадного алгоритма изображен на рис. 6.2.
а) взвешенный граф б) выбор 1-го ребра в) выбор 2-го ребра
г) выбор 3-го ребра д) выбор 4-го ребра е) выбор 5-го ребра
Рис. 6.2. Построение минимального остовного
дерева жадным алгоритмом
Пунктиром обозначены ребра, среди которых на следующем шаге алгоритма ищется ребро с минимальным весом. Построенное дерево Т имеет суммарный вес ребер, равный 23.
При внимательном рассмотрении жадный алгоритм оставляет двойственное впечатление. С одной стороны он прост, но запрограммировать его – далеко не тривиальная задача. Дело в том, что в п.4 алгоритма содержится скрытый под алгоритм, заключающийся в определении возможного цикла в построенном дереве Т. Реализация же данного пол-алгоритма может сделать неэффективным сам жадный алгоритм.
Рассмотренный ниже алгоритм Прима свободен от этого недостатка. Он настолько прост, что трудно поверить в его корректность.