Как рассчитать эту логарифмическую сложность с помощью суммирования?
Мой вопрос
Какова сложность Big-O для этого фрагмента кода? Рассмотрим n как степень 4.
for(int i = 1; i <= n; i = i*4)
for(int k = 1; k <= i; k++)
// constant statement
Что я знаю до сих пор
Я попытался превратить этот код в суммирование, чтобы найти сложность. Вот что я получил:
Я получил (база 4) log(n), вычисляя ряды 4, 4^2, 4^3 ... 4^r = n. r = (основание 4) log(n).
Я сейчас застрял в этом суммировании:
Пожалуйста, дайте мне знать, если я делаю что-то не так или есть другой способ сделать это.
2 ответа
Вы на правильном пути, но ваше внутреннее суммирование неверно. Вы правы, что внешний цикл будет повторять log_4 n раз, но вы настроили внешнюю сумму так, чтобы я считал 1, 2, 3, ..., log_4 n, а не 4^0, 4^1, 4^2, ... 4^log_4 n. В результате верхняя граница этого внутреннего суммирования неверна. Граница должна быть 4 ^ я, а не я.
Если вы все настроите таким образом, вы обнаружите, что общая сумма
4 ^ 0 + 4 ^ 1 + 4 ^ 2 +... + 4 ^ log_4 n
= (4 ^ (log_4 n + 1) - 1) / (4 - 1) (используя формулу для суммы геометрического ряда
= (4 (4 ^ log_4 n) - 1) / 3
= (4n - 1) / 3
= Θ (n).
Вы можете использовать wolframalpha, чтобы получить результат с чрезвычайной точностью.
https://www.wolframalpha.com/input/?i=sum+i,+i%3D1+to+log_4(n)