Анализ рекурсивных функций (или даже их оценка) - нетривиальная задача. Хорошее введение (на мой взгляд) можно найти в книге Дона Кнутса Конкретная математика .
Однако, давайте проанализируем эти примеры сейчас:
Мы определяем функцию, которая дает нам время, необходимое для функции. Предположим, что t(n)
обозначает время, необходимое для pow(x,n)
, то есть функцию n
.
.
Тогда мы можем сделать вывод, что t(0)=c
, потому что если мы вызываем pow(x,0)
, нам нужно проверить, (n==0
), а затем вернуть 1, что можно сделать за постоянное время (отсюда и константа * 1015) *).
Теперь рассмотрим другой случай: n>0
. Здесь мы получаем t(n) = d + t(n-1)
. Это потому, что нам снова нужно проверить n==1
, вычислить pow(x, n-1
, следовательно (t(n-1)
) и умножить результат на x
. Проверка и умножение могут быть выполнены в постоянное время (постоянное d
), рекурсивный расчет pow
необходимо t(n-1)
.
Теперь мы можем «расширить» термин t(n)
:
t(n) =
d + t(n-1) =
d + (d + t(n-2)) =
d + d + t(n-2) =
d + d + d + t(n-3) =
... =
d + d + d + ... + t(1) =
d + d + d + ... + c
Итак, сколько времени потребуется, чтобы мы достигли t(1)
? Поскольку мы начинаем с t(n)
и вычитаем 1 на каждом шаге, для достижения t(n-(n-1)) = t(1)
требуется n-1
шагов. Это, с другой стороны, означает, что мы получаем n-1
умноженное на постоянную d
, а t(1)
оценивается как c
.
Итак, получаем:
t(n) =
...
d + d + d + ... + c =
(n-1) * d + c
Итак, мы получаем t(n)=(n-1) * d + c
, который является элементом O (n).
pow2
можно сделать, используя Теорема Мастера . Поскольку можно предположить, что функции времени для алгоритмов монотонно растут. Итак, теперь у нас есть время t(n)
, необходимое для вычисления pow2(x,n)
:
t(0) = c (since constant time needed for computation of pow(x,0))
для n>0
получаем
/ t((n-1)/2) + d if n is odd (d is constant cost)
t(n) = <
\ t(n/2) + d if n is even (d is constant cost)
Вышесказанное можно «упростить» до:
t(n) = floor(t(n/2)) + d <= t(n/2) + d (since t is monotonically increasing)
Таким образом, мы получаем t(n) <= t(n/2) + d
, который можно решить, используя теорему мастеров для t(n) = O(log n)
(см. Раздел Применение к популярным алгоритмам в ссылке на википедию, пример «Бинарный поиск»).