Добавил:
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. Варианты
- •БИБЛИОГРАФИЧЕСКИЙ СПИСОК
- •АЛФАВИТНЫЙ УКАЗАТЕЛЬ
- •ОГЛАВЛЕНИЕ

nu
)(
(П.4)
c ≤
2
.
nw
)(
Если неравенства (П.3), (П.4) для
всех n ≥ n
верны одновре-
0
менно
)(
то пишут
u(n) = Θ
c
[w(n)], или u(n) w(n), и считают, что функция
nu
)(
nw
(П.5)
,0,0,
>>≤≤ ccc
2112
u(n) равна w(n) по порядку роста. Эту оценку называют асимптотически точной оценкой
имеет конечный и отличный от нуля предел
вует вещественная константа
то неравенства (П.5) справедливы и
определение
o-малое через предел (П.2), дает возможность применить
для u(n). Заметим, что если отношение (П.1)
при n → ∞, т. е. сущест-
с > 0, такая, что
)(
lim c
n=∞→
nu
nw
(П.6)
,
)(
u(n) = Θ
[w(n)]. Этот факт, как и
в анализе алгоритмов аппарат математического анализа для вычисления пределов (например, правило Лопиталя и формулу Стирлинга).
Пример П.3. Пусть u(n) = 3n
2
+ 7n + 2. Тогда u(n) = о (n3), по-
скольку предел
2
nn
273
lim
n
++
∞→
3
n
0
=
равен нулю. Подобным образом можно показать, что
u
(n) = о (2n). Кроме того, u(n) = Θ (n2), так как предел
2
nn
273
равен константе. Отсюда
lim
∞→
n
u(n) = O
++
2
n
(n2) и u(n) = Ω (n2).
3
=
u(n) = о
(n2 ln
n),
Используя введенные определения асимптотических обозначений, нетрудно доказать справедливость свойств, сформулированных
в следующих утверждениях.
131

Утверждение П.1. Для любых функций u(n), w(n) и h(n), не
обращающихся в 0 хотя бы при n ≥ n0, справедливы следующие свойства асимптотических оценок.
Рефлексивность всех оценок, за исключением о-малое:
1)
u(n) = Θ
[u(n)], u(n) = O [u(n)], u(n) = Ω [u(n)].
2) Симметричность асимптотически точной оценки:
если
u(n) = Θ
[w(n)], то w(n) = Θ [u(n)].
3) Транзитивность всех оценок:
если u(n) = o [w(n)] и w(n) = o [h(n)], то u(n) = o [h(n)];
если
если
если
u(n) = Θ
u(n) = O
u(n) = Ω
[w(n)] и w(n) = Θ [h(n)], то u(n) = Θ [h(n)];
[w(n)] и w(n) = O [h(n)], то u(n) = O [h(n)];
[w(n)] и w(n) = Ω [h(n)], то u(n) = Ω [h(n)].
Утверждение П.2. Для любых двух функций u(n) и w(n), не
n ≥ n
обращающихся в 0 хотя бы при
1) Если
u(n) = o
[w(n)], то u(n) = O [w(n)] (o-малое влечет O-
, справедливы высказывания.
0
большое), но обратное не всегда верно.
u(n) = Θ[w(n)] тогда и только тогда, когда u(n) = O
2)
u
(n) = Ω [w(n)] (Θ-оценка влечет O-оценку и Ω-оценку).
3) Если
(n) = Ω [w(n)], то w(n) = O [u(n)].
u
u(n) = O
[w(n)], то w(n) = Ω [u(n)], и наоборот, если
[w(n)] и
Утверждение П.3. Для любых функций, не обращающихся в 0
n ≥ n
хотя бы при
1)
Правило суммы: если u(n) = Θ
w
(n) ≼ w1(n), то u(n) + h(n) = Θ [w1(n)].
2
, справедливы высказывания.
0
[w1
(n)], h(n) = Θ [w2(n)] и
2) Правило произведения: если u(n) = Θ [w1(n)], h(n) = Θ [w2(n)],
u(n) ⋅ h(n) = Θ
то
Правила 1 и 2 верны и для
(n) ⋅ w2(n)].
[w1
О-оценки.
В анализе алгоритмов принято сравнивать алгоритмы между
собой по порядку роста их функций сложности. Пусть
функции временной сложности алгоритмов
Считают, что алгоритм
A
, если t1(n) t2(n), т. е. t1(n) = o [t2(n)].
ма
2
A
асимптотически быстрее алгорит-
1
A
и A
соответственно.
1
2
132
t
(n), t2(n) –
1

A
Алгоритм
t
(n) t2(n), т. е. t1(n) = O [t2(n)].
ли
1
При
t
2
птотически не быстрее
Алгоритмы
выполнения
, если t1(n) t2(n), т. е. t1(n) = Θ [t2(n)].
t(n) = Θ
При
асимптотически не медленнее алгоритма A2, ес-
1
(n) t1(n), т. е. когда t1(n) = Ω [t2(n)], алгоритм A1 асим-
алгоритма A2.
A
, A
асимптотически равнозначны по времени
1
2
(1) алгоритм сводится к выполнению постоянного
числа элементарных операций. Время выполнения такого алгоритма
ограничено сверху константой, не зависящей от объема обрабатываемых данных. При анализе конкретного алгоритма всегда стремятся
получить асимптотически точную
Если это не удается, то ограничиваются
тературе по анализу алгоритмов
Θ-оценку его функции сложности.
O-оценкой. В обширной ли-
O-оценка наиболее употребительная.
Эта оценка позволяет «похвалить» исследуемый алгоритм, указав, что
он работает не медленнее, чем некоторый другой алгоритм.
Замечания
1. С позиции асимптотического подхода шаг алгоритма элемен-
тарный, если он состоит из конечного числа операций, выполняемых
Θ
за время
(1). К таким операциям традиционно относят:
– арифметические операции (+, –,
×, /), осуществляемые над посто-
янным числом (обычно 2) операндов фиксированного размера;
– операции присваивания, выполняемые над одним операндом
фиксированного размера;
– операции сравнения (
<, ≤, >, ≥, =, ≠), применяемые к двум опе-
рандам фиксированного размера;
– логические операции (AND, OR, NOT), осуществляемые над
постоянным числом операндов фиксированного размера;
– побитовые (поразрядные) операции, выполняемые над посто-
янным числом операндов фиксированного размера;
– операции ввода
вывода, используемые для чтения или записи
/
постоянного числа элементов данных фиксированного размера;
– условные операции ветвления, когда проверяемое условие
представлено логическим выражением над постоянным числом операндов фиксированного размера;
– условные операции ветвления.
133

2. При оценке времени выполнения элементарных функций сле-
ϕ
|.
ϕ
ϕ
дует проявлять осторожность. Например, если значение функции sin
надо вычислить при небольшом значении
Θ
мени
(1), необходимом для реализации этой операции, разумно. Од-
нако при очень больших значениях |
ϕ, то предположение о вре-
| для нахождения значения sin
ϕ
потребуется цикл, число повторений которого будет зависеть от |
3. Операнд фиксированного размера – это операнд, для хране-
Θ
ния которого достаточно
(1) памяти.
Пример П.4.
Рассмотрим пример, иллюстрирующий сравнение
двух алгоритмов решения одной и той же задачи.
Пусть требуется для заданного значения
ние полинома
P(x) = an x
n
+ a
n – 1
x
n – 1
+ … + a
данными этой задачи являются значение
полинома
и значения
становкой
a
, a
, …, a1, a0. Пусть для хранения каждого коэффициента
n
n – 1
b достаточно одной условной единицы памяти.
Проанализируем алгоритм
x = b в P(x) и алгоритм A
A1 вычисления значения P(b) под-
вычисления того же значения при
2
x = b вычислить значе-
2
x
+ a
x + a
1
. Исходными
0
2
b и значения коэффициентов
помощи схемы Горнера. Считаем, что длина входа этих алгоритмов
определяется значением n (точнее, равна n′ = n + 2). Выразим функции
временной сложности этих алгоритмов через
Для нахождения a
i
b
надо выполнить i операций умножения.
i
Общее число операций умножения, которые выполняет алгоритм
n.
A
1
определяет формула
,
)1(
+
.
2
Для вычисления суммы
12...)1(
=+++−+nnnn
n + 1 слагаемых требуется выполнить
n операций сложения. Таким образом, общее число операций алго-
ритма
A
равно
1
1
2
)1(
nn
+
)(
nt Θ=
=
Для вычисления значения
P(b) = b(b(…(b(an b + a
n – 1
n
=+
P(b) по схеме Горнера
) + a
)3(
nn
+
2
) + … + a2) + a1) + a0
n – 2
2
(П.7)
).(
n
134

достаточно выполнить
ния, так что общее число операций для алгоритма
Таким образом, алгоритм
ритма
A
, поскольку
1
lim
t
(n) t1(n). Заметим, что согласно утверждению П.3 переход от
т. е.
2
n операций умножения и n операций сложе-
A
составит
2
t
(n) = 2n = Θ(n). (П.8)
2
A
асимптотически быстрее алго-
2
)(
nt
2
lim
=
)(
nt
1
2
n
=
2/)3(
+
lim
nnn
4
∞→∞→∞→
+
nnn
,0
=
3
n к n′ не изменяет оценки (П.7), (П.8) и результат сравнительного
A
анализа алгоритмов
и A2.
1
Далее приведем известные оценки, которые часто используют
в анализе алгоритмов [13]. Здесь
i, n, k ∈ Z
.
+
Оценки формул суммирования:
∑
i
∑
i
n
=
n
=
∑
i
=
1
1
∑
i
n
n
i
=
∑
1
i
=
2
i
=
n
3
i
=
=
1
k
i
=
k
0
n
∑
0
i
=
n
∑
i
=
1
nn
+
2
6
nn
4
n
1
+
1
−
1
−
k
ni
+
1
i
+
1 n
ni
+
)1(
nnn
1 n
n
2
);(
n
Θ=
)12)(1(
++
22
)1(
n
Θ=
4
);(
n
Θ=
n
≠Θ=
kk
);2(122
Θ=−=
nni ⋅Θ=+−=
Θ+=
);1(ln
3
);(
;1),(
);2(22)1(2
135

+
∑
i
n
1
ii
+
=
1
n
=
Θ=
n
+
1)1(
).1(
Оценки комбинаторных чисел:
n
n
⎞
⎛
nn
=
⎜
e
⎝
Θ+
⎟
⎠
Стирлинга;формула)),/1(1(π2! n
);(!nnon =
!
k
C
n
n
=
−
knk
2
n
C
n
⎛
⎜
Θ=
⎜
)!(!
⎝
⎛
2
⎜
Θ=
⎜
⎝
n
⋅
)(π2
−
knk
n
⎞
⎟
⎟
2/π
n
⎠
n
n
−
n
⎞
⎟
;
−knk
⎟
)(
knk
⎠
.четногодля,
Оценки для экспоненты и логарифма:
n
;1 nen+≥
1nnn
.)1(ln
≤+≤
П.4. Полиномиальные и экспоненциальные
алгоритмы
Традиционно для классификации алгоритмов используют асимптотический подход, а в качестве
ют множество алгоритмов
ций сложности.
Выделяют два сложностных класса: низкозатратные
(полиномиальные) алгоритмы и высокозатратные (экспоненциальные)
алгоритмы.
Алгоритм называют
время его работы
сложностного класса рассматрива-
с характерным порядком роста их функ-
полиномиальным, если при длине входа n
t(n) n
c
,
т. е.
t(n) = O
(nc), где c – неотрицательное вещественное число. Значит,
вычислительная сложность полиномиальных алгоритмов ограничена
полиномом, быть может, очень большой, но конечной степени.
136

Полиномиальные алгоритмы принято считать
эффективными,
поскольку на практике они обычно работают довольно быстро. Между
тем, если степень полинома значительная, то и полиномиальный алгоритм может работать неприемлемо долго. Поэтому при решении практических задач всегда отдается предпочтение полиномиальному алгоритму меньшей степени.
Поскольку сумма, произведение и композиция полиномов есть
снова полином, то классу полиномиальных алгоритмов
присуще
свойство замкнутости:
– можно комбинировать полиномиальные алгоритмы (один по-
линомиальный алгоритм может вызывать другой полиномиальный алгоритм в качестве «подпрограммы»), при этом в целом время работы алгоритма остается полиномиальным;
– можно выполнять полиномиальные преобразования входа ал-
горитма (например, переходить от одного алфавита к другому), оставаясь в границах полиномиальных затрат
на вычис-
ления.
Второй класс алгоритмов – это алгоритмы, функция сложности
которых растет быстрее любого полинома: для любого неотрицательного вещественного числа
c всегда
nc t(n).
Такие алгоритмы принято называть
номиальными
).
экспоненциальными (или неполи-
Строго говоря, функция сложности экспоненциальных алгоритмов может отличаться от экспоненты. Например, алгоритм с
функцией сложности
t(n) = Θ
(n!) считают экспоненциальным, учи-
тывая, что
λn
nc e
n!, c > 0, λ > 0.
Ясно, что при
n → ∞ никакое быстродействие современных компью-
теров пока не в силах справиться за реальное время с подобной экспоненциальной сложностью алгоритма.
Что касается емкостной сложности, то с прикладной точки зрения наибольший интерес представляют полиномиальные оценки от
длины входа. Ясно, что если алгоритм полиномиальный по времени, то
137

∞=∞
=
он так же является полиномиальным и по памяти: короткое вычисление не может использовать слишком большую память.
Для установления принадлежности функции сложности алгоритма к одному из двух указанных сложностных классов полезны следующие две леммы, хорошо известные в математическом анализе [9].
Лемма П.1 (о логарифмическом пределе). Пусть
.)(lim,)(lim
nwnu
∞→∞→
nn
Тогда если ln
u(n) ln w(n), то u(n) w(n).
Лемма П.2. Для произвольных вещественных положительных
ξ
констант
, ξ2, ξ3, τ1, τ2, τ3 отношение
1
ξξ
21
справедливо, если и только если
ξ
если
= τ1, ξ2 = τ2, ξ3 < τ3.
1
ξ
3
≺
ξ
< τ1, или если ξ1 = τ1, ξ 2 < τ2, или
1
ττ
21
τ
3
)ln(ln)(ln)ln(ln)(ln nnnnnn
Пример П.5. Покажем, что алгоритм с функцией временной
сложности
ξ1ξ
−
)(ln
nna
aent
1ξ00,,)(
<<>=
является экспоненциальным. Действительно, для произвольных констант
a > 0, 0 < ξ < 1, λ > 0 всегда (1 − ξ) > 0 и справедливы пределы
lim
n
c
)ln(
n
nna
e
lim
ξ1ξ
−
)(ln
)ln(
ln
nc
∞→∞→
nan
lim
−
ξ1ξ
∞→
nn
)(ln
ξ
nc
)(ln
ξ
na
.0
===
Следовательно, по лемме П.1
c
).(ntn
≺
Это означает, что рассматриваемый алгоритм экспоненциальный по
времени выполнения.
138

П.5. Немного о сложности задач
В общем случае для алгоритмически разрешимой задачи может
существовать несколько алгоритмов. С практической точки зрения
важно не просто их существование, а поиск среди них наиболее эффективного. Под сложностью задачи принято понимать минимальную
из сложностей алгоритмов, решающих эту задачу
Обширная алгоритмическая практика свидетельствует, что для
некоторых задач удается построить эффективные алгоритмы − алгоритмы полиномиальной сложности. Такие задачи называют
ально разрешимыми
Для многих практически важных задач до сих пор эффективные
алгоритмы не найдены, но и не доказана невозможность их существования. Их принято называть
мыми)
. Для решения трудноразрешимых задач используют алгоритмы
неполиномиальной сложности. Большинство таких алгоритмов – это
варианты полного перебора.
К классу трудноразрешимых задач относится большое число задач
алгебры, математической логики, теории графов, теории автоматов и прочих разделов дискретной математики. В книге М. Гэри и Д. Джонсона [10]
приведен список, включающий более чем 300 трудноразрешимых задач,
а в настоящее время их известно в несколько раз больше.
Возникает вопрос: неудача в нахождении для трудноразрешимой задачи полиномиального алгоритма является следствием неумения разработчиков или результатом особого свойства задачи. Ответ на
этот вопрос дает теория сложности вычислений:
мость – это свойство самой задачи
Приведенное здесь разбиение множества задач на полиномиально разрешимые и трудноразрешимые не является математически
точным. В самом деле, используемое словосочетание «алгоритм не
удается найти» допускает различное толкование: «алгоритм не существует вообще» или «алгоритм существует, но пока не найден».
Формальное разделение задач на классы по достижимой эффективности их решения
познавательным задачам. При этом вместо РАМ использовано точное
определение алгоритма в виде машины Тьюринга [1, 15]. Определены
два основных класса сложности задач
(или эффективно разрешимыми).
трудноразрешимыми (или труднорешае-
.
осуществлено только применительно к рас-
P и NP.
.
полиноми-
трудноразреши-
139

P (Deterministic Polynomial, детерминированная полино-
Класс
миальная сложность
торых существует алгоритм с полиномиальным временем работы.
Существование такого алгоритма подразумевает наличие детерминированной машины Тьюринга полиномиальной временной сложности.
Класс
NP (Nondeterministic Polynomial, недетерминированная
полиномиальная сложность
которые могут быть решены за полиномиальное время с помощью
недетерминированного алгоритма, т. е. алгоритма, представляемого
недетерминированной машиной Тьюринга.
В детерминированной машине Тьюринга вычислительный процесс не зависит от случайных факторов и всегда развивается по одной
траектории, определяемой исходными данными. Поведение недетерминированной машины Тьюринга также не зависит
факторов. В ней процесс вычислений распадается на два этапа: первый этап состоит в угадывании варианта решения, а второй – в проверке (верификации) решения, предложенного некоторым угадывающим устройством. Для задач класса
зуемы за полиномиальное время.
Разница между классом
случае у нас имеются разрешающие полиномиальные алгоритмы, а во
втором случае мы таких алгоритмов не знаем. Зато знаем, как за полиномиальное время проверить,
условиям задачи
миально проверяемыми
Таким образом, интуитивно класс
множество задач, которые можно «быстро» (за полиномиальное время)
решить, а класс
проверить. Понятно, что решить задачу намного труднее, чем проверить
готовое решение. Поэтому очевидно, что P ⊆ NP. К настоящему времени
пока не удалось строго доказать или опровергнуть более сильные соотношения:
что верно строгое включение:
существование в классе
полными. Универсальность этих задач состоит в том, что построение полиномиального алгоритма для любой такой задачи повлечет за собой возможность построения полиномиального алгоритма для всех остальных
P = NP, P ⊂ NP. Однако большинство специалистов полагают,
) – множество распознавательных задач, для ко-
) − множество распознавательных задач,
от случайных
NP оба этапа должны быть реали-
P и NP состоит в том, что в первом
удовлетворяет ли готовое решение
. Поэтому задачи класса NP называют также полино-
.
P можно представить себе как
NP – множество задач, решения которых можно «быстро»
P ⊂ NP. Основанием для этого является
NP универсальных задач, которые названы NP-
140
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
