Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Комбинаторные алгоритмы. Множества, графы, коды. Учебное пособие.pdf
Скачиваний:
0
Добавлен:
06.09.2026
Размер:
1 Мб
Скачать
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. Сложность алгоритма
Целью анализа алгоритма является оценка его качества. В ана-
лизе алгоритмов применяют различные критерии качества в виде ко­личественных характеристик алгоритма. Сложность одна из важ­нейших характеристик алгоритма. Существуют различные трактовки этого понятия [14, 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
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]