При n = 1 log 1 = 0, а это мешает выполнению неравенства при начальных условиях. Поэтому-то n0 = 2.
Доказано.
Как же угадать оценку?
Можно действовать по аналогии, т. к. похожая формула может иметь такую же оценку. Например, f(n) = 2f(n/2 + 6) + Θ(n) также имеет оценку O(nlogn), что логично предполагать.
Можно приближать оценки постепенно, пока очередную приближённую оценку ещё можно будет доказать.
Можно использовать замену переменных для нахождения подобия.
Можно, в конце концов, просто взять оценку получше с потолка и доказать.
Как вы успели заметить, этот способ оценки не даёт чёткого ответа, а лишь может подтвердить его. Следующий способ уже не стреляет наобум, а даёт конкретный ответ.
3.3 Метод итераций
В этом методе оценочная функция подставляется сама в себя до тех пор, пока не будет видна очевидная закономерность, которая и позволит произвести оценку.
Рассмотрим этот метод на примере сортировки слиянием. У нас есть рекуррентное соотношение f(n) = 2f(n/2) + Θ(n). Его можно разложить в сумму следующим образом:
f(n) = 2f(n/2) + n = n + 2(n/2 + 2f(n/4)) = n + 2(n/2 + 2(n/4 + sf(n/8))) = …
Здесь чётко прослеживается сумма по n. В итоге получим формулу:
f(n) = n + n + … + n + Θ(2log n)
Тут n повторится logn раз (поскольку до вызова f(1) рекурсия дойдёт через logn шагов; собственно, по этой же причине останется 2log n членов f(1) с оценкой Θ(1)). Имеем формулу:
f(n) = sum(0, log n) n + Θ(n) = n log n + n + Θ(n) = Θ(n log n)
Итак, нами найдена точная асимптотическая оценка сортировки слиянием. Она оказалась равна ожидаемой, что является просто замечательным фактом.
Этот метод нахождения оценки очень хорош. Но у него есть и недостаток – сложно уследить за временем, потраченном на очередном уровне рекурсии, и глубиной рекурсии одновременно. Для облегчения этой задачи используются деревья рекурсии.
Покажем дерево рекурсии для нашей сортировки:
n
n/2 n/2
n/4 n/4 n/4 n/4
……
Глубина полученного дерева – logn, а сумма элементов каждого уровня равна n. Получаем для сортировки оценку f(n) = Θ(nlogn).
Итак, метод итераций в паре с деревьями рекурсии даёт хороший результат. Но следующий метод даёт универсальную функцию для определённых типов рекурсий.
3.4 Общая формула
К счастью, оценку рекурсивного алгоритма совсем не обязательно угадывать или искать на дереве рекурсии. Существуют формулы для автоматического определения оценки алгоритмов. Эти формулы подходят только для алгоритмов, трудоёмкость которых выражается формулой:
f(n) = af(n/b) + g(n),
где a >= 1, b > 1 – константы, а g(n) – функция, положительная для больших значений n.
Такое соотношение обычно возникает, если алгоритм разбивает задачу на a подзадач трудоёмкостью n/b каждая. Для объединения результатов выполнения этих подзадач необходимо время g(n).
Основная теорема о рекуррентных оценках
Пусть a >= 1 и b > 1 – константы, g(n) – функция, f(n) определено при неотрицательных n формулой
f(n) = af(n/b) + g(n),
где под n/b понимается либо ceil(n/b), либо floor(n/b). Тогда:
1) если g(n) = O(nlogba-e) для некоторого e > 0, то f(n) = Θ(nlogba);
2) если g(n) = Θ(nlogba) , то f(n) = Θ(nlogbalogn);
3) если g(n) = Ω(nlogba+e) для некоторого e > 0 и если ag(n/b) <= cg(n) для некоторой константы c < 1 и достаточно больших n, то f(n) = Θ(g(n)).
В чём же заключается суть теоремы?
Функция g(n) сравнивается с nlogba и, в зависимости от результатов, выводится та или иная оценочная формула. При этом функция g(n) не просто должна быть меньше или больше nlogba – между функциями или не должно быть зазоров, или должен быть зазор не меньше ne, при этом e есть сколь угодно малая константа. Кроме того, должно выполняться условие регулярности ag(n/b) <= cg(n), которое гарантирует у последующих шагов трудоёмкость не большую, чем у предыдущих.
Попробуем применить основную теорему к сортировке вставками. Для неё a = b = 2, g(n) = n. Тогда nlogba = n, g(n) = n = Θ(n).
Значит, f(n) = Θ(nlogn), что и требовалось доказать.
4 Домашнее задание
1. Оцените алгоритмы задач II тура.
2. С помощью метода итераций решите соотношение f(n) = f(n - a) + f(a) + n, a >= 1 – некоторая константа.
3. С помощью основной теоремы найдите оценку времени работы алгоритма двоичного поиска (f(n) = f(n/2) + Θ(1)).
4. Дан массив S из n действительных чисел, а также число x. Как за время Θ(nlogn) определить, можно ли представить x в виде суммы двух элементов массива S?
5 Список литературы
Т. Кормен, Ч. Лейзерсон, Р. Ривест [2001], Алгоритмы. Построение и анализ, МЦНМО, М., 35–77
Дональд Э. Кнут [2000], Искусство программирования, третье издание. Том 1: Основные алгоритмы, Вильямс, 127-155
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.