Асимптотическая временная сложность рекурсивной функции (тета)

Меня попросили проанализировать асимптотическую временную сложность следующей функции рекурсии:

for-all k ≥ 1:
T(n) = n + T(n/2) + T(n/4) + T(n/8) + .... + T(n/2^k)

Мне удалось доказать, что:
T(n) = O(n⋅log n) и T(n) = Ω(n),
но я ищу более тесную границу (Большое тета).


person user111893    schedule 12.11.2014    source источник
comment
Ваша формула читается так, как будто выражение для T бесконечно — это правильно?   -  person Ordous    schedule 12.11.2014
comment
Функция не бесконечна, так как последнее слагаемое равно T(n/2^k).   -  person user111893    schedule 12.11.2014
comment
Тем не менее, k не ограничено, как вы сами написали: для всех k ›= 1   -  person Ordous    schedule 12.11.2014
comment
Да, но нам нужно решение для любого данного k.   -  person user111893    schedule 12.11.2014
comment
Итак, вы смотрите на семейство функций Tk, и для каждого из этих семейств k является константой?   -  person Ordous    schedule 12.11.2014
comment
Честно говоря не знаю, судя по формулировке задачи непонятно, просят общее решение или семейство решений каждого заданного k, то что описано выше и есть вся проблема.   -  person user111893    schedule 12.11.2014
comment
Я согласен с вашими оценками (n*log(n) для k->inf, 2n-1 для k = 1), однако я не могу найти ничего для промежуточных сумм. Wolfram и Matlab тоже ничего не дают. Судя по результатам, которые мне удалось получить, он ни линейный, ни логлинейный. Возможно, вам больше повезет с Mathematics.SE — этот вопрос на самом деле не о программировании.   -  person Ordous    schedule 12.11.2014


Ответы (1)


Прежде всего:
я понимаю "для всех k >= 1" следующим образом: от k = 1 до k = m, где 2m-1 ≤ n ≤ 2m.
Таким образом, в основном выполняется m = log₂(n).

Посмотрите на мой расчет:

T(n) = n + Σk=1,...,m T(n/2k)
     = n + T(n/2) + Σk=2,...,m T(n/2k)
     = n +  n/2 + 2⋅Σk=2,...,m T(n/2k)
     = ...
     = n + Σk=1,...,m k⋅n/2k
     = n + n⋅Σk=1,...,m k/2k
     = n + n⋅(2 - 2-mm - 21-m)
     ≤ n + 2⋅n
     = 3n

So T(n) is in Θ(n).

Примечание:
Вы также можете аппроксимировать Σk=1,...,m k/2k интегралом s(m) = ∫1m k/2k dk.
И здесь также выполняется limm → ∞s(m) = 2.

person AbcAeffchen    schedule 14.03.2015