2. Теоретические сведения
В анализе алгоритмов точное знание количества операций,
выполненных алгоритмом, не играет существенной роли.
Более важной характеристикой является скорость роста
этого числа при возрастании объема входных данных. Она
называется скоростью роста алгоритма.
Скорость роста определяется старшим, доминирующим,
членом формулы, описывающей сложность алгоритма.
Поэтому можно пренебречь младшими членами, которые
растут медленнее. Отбросив все младшие члены, получают
то, что называется порядком функции или алгоритма,
скоростью роста сложности которого она является.
Алгоритмы можно сгруппировать по скорости роста их
сложности:
• алгоритмы, сложность которых растет по крайней мере так
же быстро, как рассматриваемая функция;
• алгоритмы, сложность которых растет с той же скоростью;
• алгоритмы, сложность которых растет медленнее, чем эта
функция.
3. Теоретические сведения
Класс функций, растущих по крайней мере так же быстро, как
f, обозначают через Ω(f). Функция g принадлежит этому
классу, если при, всех значениях аргумента n, больших
некоторого порога n0 значение g(n) > cf(n) для некоторого
положительного числа c.
Класс функций, растущих не быстрее f, обозначается O(f).
Функция f образует верхнюю границу для класса O(f). С
формальной точки зрения функция g принадлежит классу
O(f), если g(п) < cf(n) для всех n, больших некоторого
порога n0, и для некоторой положительной константы c.
Через Θ(f) обозначают класс функций, растущих с той же
скоростью, что и f. С формальной точки зрения этот класс
представляет собой пересечение двух предыдущих
классов.
Каждый из классов Ω(f), O(f) и Θ(f) является множеством, и
поэтому имеет смысл выражение «g – элемент этого
множества». В анализе, однако, нередко пишут g = O(f), что
на самом деле означает g ∈ O(f).
4. Теоретические сведения
Верхняя асимптотическая граница, предоставляемая Oобозначениями,
может
описывать
асимптотическое
поведение функции с разной точностью. Граница
2n2 = O(n2) дает правильное представление об
асимптотическом поведении функции, а граница 2n = O(n2)
его не обеспечивает. Для обозначения того, что верхняя
граница не является асимптотически точной оценкой
функции, применяются o-обозначения. Формально функция
g принадлежит классу o(f), если для любой положительной
константы c существует такое положительное n0, что
g(п) < cf(n) для всех n ≥ n0. Например: 2n = o(n2), но
2n2
≠ o(n2).
ω-обозначения соотносятся с Ω-обозначениями так же, как oобозначения с O-обозначениями. С помощью ωобозначений указывается нижний предел, не являющийся
асимптотически точной оценкой. Функция g принадлежит
классу ω(f), если для любой положительной константы c
существует такое положительное n0, что при всех значениях
аргумента n ≥ n0, значение g(n) > cf(n).
5. Теоретические сведения
Пример 1. Если дано f(t) = 5 + sin(t) и g(t) = 1,
то 5 + sin(t) = Θ(1), так как 4 × 1 ≤ 5 + sin(t) ≤ 6 × 1.
Между функциями Θ, O, Ω, o и ω существуют полезные
отношения, некоторые из которых представлены ниже.
Пусть f и g – положительные функции от n. Тогда,
например:
• f(n) = O(g(n)) ⇔ g(n) = Ω(f(n));
• f(n) = Θ(g(n)) ⇔ g(n) = Θ(f(n));
• f(n) = Θ(g(n)) ⇔ [f(n) = O(g(n)) и f(n) = Ω(g(n))];
• f(n) = o(g(n)) ⇔ g(n) = ω(f(n));
• f(n) = o(g(n)) ⇒ f(n) = O(g(n)), но обратное не верно;
• f(n) = ω(g(n)) ⇒ f(n) = Ω(g(n)), но обратное не верно;
• f(n) ограничено сверху и снизу положительными
константами тогда и только тогда, когда f(n) = Θ(1)
и др.
6. Теоретические сведения
Чтобы определить отношения между функциями f и g, часто бывает
полезно определить значение предела L отношения f(n)/g(n) при n → ∞.
Значение предела позволяет сделать ряд выводов.
1. L = 0. Это означает, что g(n) возрастает с большей скоростью, чем f(n),
и отсюда f(n) = O(g(n)).
2. L = ∞. Это означает, что f(n) возрастает с большей скоростью, чем g(n),
и отсюда f(n) = Ω(g(n)).
3. L ≠ 0 и ограничено. Это означает, что f(n) и g(n) возрастают с
одинаковой скоростью и отсюда f(n) = Θ(g(n)) и g(n) = Θ(f(n)).
4. Предела не существует. Это означает, что данный метод нельзя
использовать для определения асимптотической оценки между f(n) и
g(n).
Пример 2. Пусть f(n) = n(n + 1) / 2 и g(n) = n2. f(n) = Θ(g(n)) так как
1
1+
f ( n)
n2 + n
n =1
lim
= lim
= lim
2
n → ∞ g ( n)
n → ∞ 2n
n→∞ 2
2
7. Контрольные вопросы
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Скорость роста алгоритмов.
Порядок роста алгоритма.
Категории алгоритмов по росту сложности.
Класс Θ.
Класс O.
Класс Ω.
Класс o.
Класс ω.
Отношения между классами Θ, O, Ω, o и ω.
Анализ предела отношения функций.
8. Указания по выполнению заданий
1.
2.
3.
4.
Получить задание
Получить решение задачи .
Подготовить отчет по выполнению задания. Отчет
должен включать задание и описание этапов
выполнения задания.
Ответить на вопросы по выполнению задания и
контрольные вопросы
9. Задания
1. Расположить следующее по возрастанию: n, n1/2, log2n, log2(log2n),
(log2n)2, (1/3)n, 4, (3/2)n, n!.
2. Доказать или опровергнуть каждое из следующих утверждений:
1) f(n) = O(g(n)) ⇒ g(n) = o(f(n));
2) f(n) + g(n) = Θ(max(f(n), g(n)));
3) f(n) = O((f(n))2);
4) f(n) = O(g(n)) ⇒ g(n) = Ω(f(n));
5) f(n) + o(f(n)) = Θ(f(n)).
3. С помощью Θ, O, Ω, o и ω описать отношения между следующими
парами функций:
1) (log2n)k, n, где k – положительная константа;
2) nk, cn, где k и c – константа k > 0, c > 1;
3) 2n, 2n/2.
4. Доказать, что 17n1/6 = O(n1/5).
5. Доказать, что n
k 1 / 6 = Θ(n 7 / 6 )
∑
k =1
10. Задания
6. Показать, что для любых действительных констант a и b, где b > 0,
справедливо соотношение (n + a)b = Θ(nb).
7. Доказать или опровергнуть утверждения 2n + 1 = O(2n) и 22n = O(2n).
8. Доказать, что время работы алгоритма равно Θ(g(n)) тогда и только
тогда, когда время работы алгоритма в наихудшем случае равно
O(g(n)), а время работы алгоритма в наилучшем случае равно
Ω(g(n)).
9. Доказать, что множество o(g(n)) ∩ ω(g(n)) пустое.