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

15. Кузюрин, Н. Н. Эффективные алгоритмы и сложность вы-
числений / Н. Н. Кузюрин, С. А. Фомин. – М.: Изд-во Моск. ун-та,
2009.
16. Лекции по теории графов / В. А. Емеличев [и др.]. – М.:
Книжный дом «ЛИБРОКОМ», 2012.
17. Липский, В. Комбинаторика для программистов /
В. Липский. – М.: Мир, 1988.
18. Макконелл, Д. Анализ алгоритмов.
Вводный курс / Д. Мак-
конелл. – М.: Техносфера, 2002.
19. Новиков, Ф. А. Дискретная математика для программистов /
Ф. А. Новиков. – СПб.: Питер, 2008.
20. Пападимитриу, Х. Комбинаторная оптимизация / Х. Папа-
димитриу, К. Стайглиц. – М.: Мир, 1985.
21. Рейнгольд, Э. Комбинаторные алгоритмы. Теория и практи-
ка / Э. Рейнгольд, Ю. Нивергельт, Н. Део. – М.: Мир, 1980.
22. Рыбников, К. Введение
в комбинаторный анализ / К. Рыбни-
ков. – М.: Изд-во Моск. ун-та, 1985.
23. Ху, Т. Комбинаторные алгоритмы / Т. Ху, М. Шинг. – Ниж-
ний Новгород: Изд-во Нижегород. ун-та им. Н. И. Лобачевского, 2004.
24. Юдин, Д. Б. Математики измеряют сложность / Д. Б. Юдин,
А. Д. Юдин. – М.: Книжный дом «ЛИБРОКОМ», 2009.
25. Яблонский
, С. В. Введение в дискретную математику: учеб.
пособие / С. В. Яблонский. – М.: Наука, 1986.
121

Приложение 1
АЛГОРИТМЫ И СЛОЖНОСТЬ
П.1. Алгоритмы и задачи
Понятие алгоритма, подобно многим фундаментальным матема-
тическим понятиям, в прикладных разделах математики кроме точного
определения используется и в неформальной трактовке. Многие компьютерные науки (теория автоматов, теория кодирования, математическая лингвистика, теория распознавания образов) в основном оперируют интуитивным определением алгоритма, основанным на здравом
смысле и практическом опыте.
С неформальной точки зрения под алгоритмом традиционно
понимается точное предписание, определяющее вычислительный процесс, идущий от варьируемых исходных данных (называемых входом
алгоритма) к искомому результату (выходу алгоритма).
Современное толкование понятия алгоритма очень схоже со
значением слов «метод», «способ», «процедура», «программа», но
имеет свой дополнительный смысловой оттенок. Уточнение смысла
выливается в постулирование ряда свойств, которыми должен обладать любой алгоритм. Укажем наиболее важные из них, раскрывающие интуитивную трактовку алгоритма.
Каждый алгоритм имеет дело с
точными, результирующими). Для размещения данных алгоритму необходима память.
состоящей из одинаковых ячеек.
Описание алгоритма должно быть конечным и дискретным,
т. е. состоять из конечного числа отдельных шагов, которые выполняются в дискретные моменты времени.
Каждый шаг должен быть элементарным. Элементарность
шага предполагает, что выполняемый объем работы на шаге мажорируется некоторой константой, зависящей от исполнителя, но не зависящей от исходных и промежуточных данных.
Память считается однородной и дискретной, т. е.
данными (исходными, промежу-
122

Последовательность шагов алгоритма
выполнения очередного шага однозначно определено, что делать на
следующем шаге.
Алгоритм должен быть результативным: для заданного набора
исходных данных последовательность шагов обязана приводить к выдаче вполне определенного результата.
детерминирована: после
Конечность действий алгоритма: для достижения результата
алгоритм должен выполнить конечное число шагов, при этом требуемое количество шагов зависит только от исходных данных.
Алгоритм должен быть единым для всех допустимых исходных
данных, т. е. удовлетворять требованию
Алгоритм
реализации, который по описанию алгоритма порождает
ный процесс
пошаговому преобразованию исходных данных в результирующие.
В качестве данных, с которыми работает алгоритм, могут вы-
ступать самые разные объекты, построенные из элементов некоторого
множества по определенным правилам, например, числа, тексты, матрицы, графы, изображения. В любом случае их всегда можно представить словами в конечном алфавите. Это универсальный способ машинного представления данных, а число символов в слове – естественная мера объема этих данных. Так, конечное множество и
различные его подмножества традиционно задаются битовыми шкалами − характеристическими (0, 1)-векторами. Всякое изображение
может быть закодировано массивом пикселей, а каждый пиксель –
тремя числами, определяющими интенсивность красного, зеленого и
синего цветов. Очевидно, что какими бы ни были алфавиты, их символы всегда можно закодировать с помощью двоичного алфавита.
Алгоритмы разрабатываются для решения тех или иных вы-
числительных задач. Наличие алгоритма для задачи – это, прежде всего, возможность запрограммировать и реализовать на компьютере
процесс ее решения.
Под задачей принято понимать некоторый вопрос, на который
нужно найти (вычислить) ответ. Различают массовые и индивидуаль-
предполагает наличие исполнителя или механизма
. Этот процесс разворачивается во времени и сводится к
массовости.
вычислитель-
ные задачи. Массовая задача Π задается
123

– списком параметров – свободных переменных, конкретные
значения которых не определены, но указаны требования, которым они удовлетворяют;
– формулировкой условий – свойств, которыми должен обла-
дать ответ (решение задачи).
Ι
Индивидуальная задача
получается из массовой задачи Π,
если всем параметрам массовой задачи придать конкретные значения –
n = |
Ι
задать исходные данные. Величина
индивидуальной
задачи. Для алгоритма, решающего задачу
| характеризует размерность
Ι
, при ус-
ловии, что исходные данные представлены в некотором алфавите, ве-
n = |
Ι
личину
| принято называть длиной входа.
Словосочетание «решить задачу» допускает различные толко-
вания. Тем не менее, в математике и компьютерных науках используется следующая алгоритмическая позиция: задача может быть реше-
на, если построен алгоритм, приводящий к решению задачи. К сожа-
лению, для решения некоторых задач не существует алгоритма. Их
называют алгоритмически неразрешимыми. Задачи, для которых разработаны алгоритмы решения, называют алгоритмически разрешимы-
ми. Для установления алгоритмической разрешимости задачи доста-
точно найти и описать разрешающий алгоритм − алгоритм, который
дает решение этой задачи. Здесь можно обойтись интуитивным представлением об алгоритме. Между тем установление алгоритмической
неразрешимости задачи требует введения строгого определения.
По форме постановки различают распознавательные, оптимиза-
ционные задачи и задачи на построение.
Суть распознавательной задачи сводится к проверке некоторого
свойства. Например, в задаче о распознавании однозначного декодирования (см. задание 8 в главе 3) необходимо ответить на вопрос, допускает ли заданный алфавитный код однозначное декодирование, т. е.
всякий ли код сообщения является кодом ровно одного сообщения.
Алгоритм решения задачи распознавания выполняет проверку
рассматриваемого свойства и выдает один из двух ответов: «да» (свойство выполняется), «нет» (свойство не выполняется). Поэтому распознавательные задачи часто называют задачами с коротким ответом.
В задаче оптимизации надо найти такое решение, которое отвечает
оптимальному значению некоторой целевой функции. Примерами задач
124

оптимизации, рассмотренных в данном учебном пособии, являются квадратичная задача о назначениях (см. задание 3 в главе 1), задача
о минимальном остове, задача о кратчайшем пути в графе (см. задания 6,
7 в главе 2), задача оптимального кодирования (см. задание 9 в главе 3).
Алгоритм решения задачи оптимизации возвращает оптималь-
ное решение, если оно существует, значение
ветствующее оптимальному решению, и ответ «нет», если решение
задачи отсутствует.
Некоторые задачи изначально имеют распознавательную форму-
лировку. Многие задачи, которые в исходной постановке представлены
как задачи оптимизации, довольно просто приводятся к распознавательной форме. Предположим, что есть некоторая задача максимизации,
в которой необходимо найти максимальное значение какой-либо
вой характеристики заданного графа
множества вершин графа, попарно смежных между собой. Тогда соответствующая задача распознавания может быть сформулирована следующим образом: для графа
решение со значением числовой характеристики, по крайней мере,
Между тем имеются задачи, которые нельзя привести к распо-
знавательной форме. Это, в первую очередь, задачи на построение.
Примерами таких задач являются перечисление всех простейших комбинаторных объектов (см. задания 2, 3 в главе 1), построение остовного дерева и многие другие подобные задачи на графах, основанные на
систематическом просмотре элементов графа (см. задание 5 в главе 2).
G и целого числа L выяснить, имеется ли
G, например, мощность клики –
целевой функции, соот-
число-
L.
П.2. Сложность алгоритма
Целью анализа алгоритма является оценка его качества. В ана-
лизе алгоритмов применяют различные критерии качества в виде количественных характеристик алгоритма. Сложность − одна из важнейших характеристик алгоритма. Существуют различные трактовки
этого понятия [1−4, 7, 10, 18, 24]. Укажем основные.
логической сложностью алгоритма понимают трудоем-
Под
кость его разработки, выраженную, например, числом человекомесяцев, потраченным на создание алгоритма. Очевидно, что такая
оценка качества алгоритма не всегда объективна, ведь время написания алгоритма сильно зависит от профессионализма разработчика.
125

Статическая сложность алгоритма отражает длину записи ал-
горитма в некоторой фиксированной форме. Типичным образцом статической сложности является длина описания алгоритма, задаваемая
количеством операторов использованного языка программирования.
Эта оценка качества также не лишена недостатка, поскольку короткий
алгоритм может работать неприемлемо долго.
Экономичность функционирования является наиболее прием-
лемым и практически значимым критерием качества алгоритма. Этот
критерий называют
алгоритма.
именно этот критерий качества.
ритма в ресурсах (времени исполнения и объеме памяти), нужных для
реализации предписанных вычислений. Соответственно различают
временную и ёмкостную сложности алгоритма. Следует заметить, что
в реальных алгоритмах временная и ёмкостная сложности,
зависимы: сокращение одной из них достигается за счет возрастания
другой. И все же наиболее важной из них является временная сложность, так как именно она определяет временные границы разрешимости
задачи и позволяет судить о практической значимости алгоритма.
полнения, измеряемое в элементарных шагах, необходимых для достижения запланированного результата. Число шагов
время выполнения алгоритма, которое задает физическое время с точностью до константы.
количеством
просто бит), используемых алгоритмом в процессе вычислений.
сти алгоритма в достаточной мере универсальными, предполагают, что
алгоритм выполняется на некотором абстрактном компьютере, который включает в себя процессор, одноадресную оперативную память и
набор элементарных операций. Такой компьютер был назван
доступной адресной машиной (РАМ) [1, 3]. Полагается, что РАМ в
состоянии выполнять арифметические операции, операции сравнения,
пересылки, условной и безусловной передачи управления. Подобные
операции считаются элементарными и выполняемыми за константное
время. Их можно рассматривать в качестве шагов алгоритма.
В анализе алгоритмов используется главным образом
Вычислительная сложность
Под
временной сложностью алгоритма понимают время его вы-
условных единиц памяти (например, машинных слов или
Чтобы сделать выводы относительно вычислительной сложно-
вычислительной (или ресурсной) сложностью
характеризует потребность алго-
как правило,
− это математическое
Емкостная сложность алгоритма определяется
равно-
126

Память РАМ состоит из неограниченного числа ячеек, к кото-
рым имеется прямой доступ. В ячейке может храниться бит, число,
символ или другая единица информации. Итак, применительно к РАМ
одна элементарная операция – условная единица времени, а одна ячейка – условная единица памяти. Общее число шагов, необходимое РАМ
для решения задачи в
соответствии с заданным алгоритмом, определяет временную сложность алгоритма, а использованное при этом число
ячеек памяти – емкостную сложность.
Одно из основных свойств алгоритма – массовость – применимость к некоторому допустимому множеству исходных данных. Разумеется, что в общем случае число шагов алгоритма и требуемая память
зависят, прежде всего, от исходных данных.
Эти зависимости принято
описывать с помощью функций. В современных публикациях по анализу алгоритмов их называют
сложности алгоритма
и обозначают через t(n), v(n), где n − целое
функциями временной и емкостной
положительное число, характеризующее длину входа алгоритма.
Покажем на простых примерах, как формируются функции вре-
менной и емкостной сложности алгоритма.
Пример П.1. Рассмотрим задачу о кратчайшем пути в графе
G = (V, E). Для решения данной задачи можно предложить переборный
алгоритм, который из конечного числа всех возможных путей между
двумя заданными вершинами находит кратчайший. Такой алгоритм
при небольшом числе вершин может оказаться не хуже (с точки зрения
времени выполнения), чем любой классический алгоритм, например,
алгоритм Дейкстры или алгоритм Флойда (см. задание 7 в главе 2).
Если число вершин начать увеличивать, то классические алгоритмы
начнут работать заведомо быстрее переборного алгоритма. Габариты
исходного графа
G = (V, E) в общем случае описываются числами
n = ⎢V ⎢ и m = ⎢E ⎢. При этом различные алгоритмы могут оперировать
всевозможными способами представления графа (матрицей смежности, матрицей инциденций, списками смежности и др.). Несмотря на
это, во всех случаях длина входа алгоритма определяется значениями
n и m, а время работы алгоритма напрямую зависит от значений этих
чисел.
Известно, что в полном графе числа n и m связаны между со-
бой формулой
m = n
(n – 1) / 2, которую часто используют для перехо-
да к одному показателю измерения длины входа алгоритма.
127

Пример П.2.
матрицы
X, Y вещественных чисел и результат записать в матрицу Z.
Пусть для хранения каждого элемента матриц
Требуется сложить две прямоугольные (n × m)-
X, Y и Z достаточно од-
ной условной единицы памяти. Очевидный алгоритм решения данной
задачи включает в себя два вложенных друг в друга цикла:
1. Цикл по
2. Цикл по
3.
i от 1 до n
j от 1 до m
Z[i, j]:= X[i, j] + Y[i, j]
На шаге 3 выполняются две операции: сложение и присваивание. Этот шаг повторяется для всякого
принимает
изменение требуется 3
n значений, а переменная j получает m значений. На их
m + 1 и 3n + 1 операций соответственно: вна-
i и каждого j. Переменная i
чале установление наименьшего значения 1, затем увеличение на 1
и последующее сравнение с наибольшим значением. Таким образом,
время выполнения алгоритма можно выразить в виде следующей
функции:
t(n, m) = n(2m + 3m + 1) + (3n + 1) = 5nm +4n + 1.
Очевидно, что размер матриц в данном случае задает количество поступающих на вход алгоритма данных и обусловливает тем самым
длину входа алгоритма. Можно вместо двух параметров
пользовать один, положив
N = max {n, m}. Тогда t(N) = 5N
n и m ис-
2
+ 4N + 1.
Емкостная сложность алгоритма подсчитывается так: если для хранения одного элемента матрицы достаточно одной условной единицы
памяти, то
v(n, m) = 3nm, или v(N) = 3N
2
.
Поскольку анализ емкостной сложности алгоритмов не столь
актуален в силу технических возможностей современных компьютеров, то в центре внимания обычно функция временной сложности
При формировании
–
худший случай, когда t(n) характеризует максимально возмож-
t(n) возможна ориентация на один из случаев:
t(n).
ное время работы алгоритма – время работы на «плохих» входах;
–
лучший случай, когда t(n) задает минимальное время выпол-
нения алгоритма – время работы при некоторых «хороших»
исходных данных;
–
средний случай, когда t(n) учитывает вероятности появления
тех или иных («хороших» или «плохих») входных данных.
128

С практической точки зрения чрезвычайно важен худший случай, поскольку он позволяет оценивать потенциальные возможности
анализируемого алгоритма. Поэтому традиционно ориентируются
именно на этот случай.
Имеется еще одна концептуальная позиция к определению
функций сложности. Обычно рассматривают поведение
птотике
ный порядок (порядок роста) функции временной сложности, скрывая
при этом значения коэффициентов и аддитивные компоненты неглавных порядков.
причинами. Во-первых, многие практические задачи имеют большую
размерность. Во-вторых, на практике, как правило, нет необходимости
в точном построении выражения для функции сложности, что зачастую и выполнить непросто. В-третьих, переход от физического времени и реальных компьютеров к математическому времени и РАМ уже
вносит ошибку в определение сложности алгоритма. Стоимость этого
перехода – константа пропорциональности.
требуют уточнения свойств функций
монотонно возрастающие функции, областью значений которых выступает множество неотрицательных вещественных чисел, а областью
определения – множество неотрицательных целых чисел Z
образом,
природы
тать, что увеличение объема исходных данных вызывает повышение
времени работы алгоритма. Закономерен вопрос: существуют ли алгоритмы, для которых нарушается условие монотонности функции
Да, существуют. Но это скорее исключение, чем правило.
при n → ∞. Получаемые при этом оценки задают t(n) глав-
Применение асимптотических оценок вызвано несколькими
Математические методы, применяемые в анализе алгоритмов,
t(n) ≥ 0 для всех n ∈ Z+. Эти предположения вытекают из
t(n). Что касается свойства монотонности, то разумно счи-
t(n) в асим-
t(n). Принято полагать, что t(n) –
. Таким
+
t(n).
П.3. Асимптотические формализмы,
используемые в анализе алгоритмов
При анализе алгоритмов используют принятые в математике
асимптотические обозначения, позволяющие выделить главный порядок функции [9, 13].
129

Пусть
функции, определенные на множестве Z
бесконечно большими величинами. При этом функция
чиная с некоторого возможно большого значения
u(n) и w(n) − это неотрицательные вещественнозначные
и являющиеся при n → ∞
+
w(n) ≠ 0, на-
n
. Суть асимпто-
0
тического оценивания состоит в изучении интересующей нас функции
u(n) относительно другой (более простой по виду) функции w(n)
путем сравнения
Функцию
больших значениях
В этом случае пишут
Принято считать, что функция
птотически
Полагают, что функция
рядку роста
ет вещественная константа
такие, что для
их отношения:
nu
(П.1)
.
)()(nw
u(n) определяют как о[w(n)] и говорят, что она при
n меньше функции w(n) по порядку роста, если
nu
)(
(П.2)
lim =
n
u(n) = o
∞→
[w(n)], или u(n) w(n).
.0
nw
)(
u(n) эквивалентна (или асим-
равна) функции w(n), и пишут u(n) w(n), если
nu
)(
lim =
∞→
n
.1
nw
)(
u(n) не больше функции w(n) по по-
, и пишут u(n) = O [w(n)], или u(n) w(n), если существу-
с
> 0 и неотрицательное целое число n0,
1
всех n ≥ n
выполняется неравенство:
0
)(
nu
)(
nw
Эту оценку
называют асимптотической верхней оценкой для u(n).
Подобным образом определяют
для функции u(n): запись u(n) = Ω [w(n)], или w(n) u(n),
оценку
верна,
если отношение (П.1) ограничено снизу, т. е. существует веще-
с
ственная константа
что для
всех n ≥ n
> 0 и неотрицательное целое число n0, такие,
2
выполняется неравенство:
0
(П.3)
.
c
≤
1
асимптотическую нижнюю
130
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
