Давайте рассмотрим как оригинальную, так и модифицированную функцию.В исходной функции у вас есть следующий объем работы:
- Постоянный объем работы для проверки базового случая.
- O (n) работа для подсчета числа.
- Работа, необходимая для рекурсивного вызова чего-то наполовину меньше.
Мы можем выразить это как отношение повторения:
- T (1) = 1
- T (n) = n + T (n / 2)
Посмотрим, как это выглядит.Мы можем начать расширять это, заметив, что
T (n) = n + T (n / 2)
= n + (n / 2 + T (n / 4))
= n + n / 2 + T (n / 4)
= n + n / 2 + (n / 4 + T (n / 8))
= n + n / 2 + n / 4 + T (n / 8)
Мы можем начать видеть образец здесь. Если мы расширим бит T (n / 2) k раз, мы получаем
T (n) = n + n / 2 + n / 4 + ... + n / 2 k + T (n / 2 k )
В конце концов, это останавливается, когда n / 2 k = 1. Когда это происходит, мы имеем
T (n) = n + n / 2 + n / 4 + n / 8 + ... + 1
Что это оценивает? Интересно, что эта сумма равна 2n + 1, потому что суммаn + n / 2 + n / 4 + n / 8 + ... = 2n. Следовательно, этой первой функцией является O (n). Мы могли бы также прийти к этому выводу, используя основную теорему , но интересно также увидеть этот подход.
Так что теперь давайте посмотрим на новую функцию. Эта функция
- Постоянный объем работы для проверки базового случая.
- Работа, необходимая для рекурсивного вызова чего-то наполовину меньше.
Мы можем записать это повторение как
- T (1) = 1
- T (n) = 1 + T (n / 2)
Используя тот же трюк, что и раньше, давайте расширимout T (n):
T (n) = 1 + T (n / 2)
= 1 + 1 + T (n / 4)
= 1 + 1 + 1 + T (n / 8)
В общем случае после расширения k раз мы получим
T (n) = k +T (n / 2 k )
Останавливается, когда n / 2 k = 1, что происходит, когда k = log 2 n (то есть lg n).В этом случае мы получаем, что
T (n) = lg n + T (1) = lg n + 1
So T (n) = O (lg n) в этом случае.
Надеюсь, это поможет!