#algorithm #performance #data-structures #runtime #big-o
#алгоритм #Производительность #структуры данных #время выполнения #big-o
Вопрос:
Я нашел этот пример проблемы в Интернете, и я просто не могу понять, как автор пришел к их выводу.
sum1 = 0;
for(k=1; k<=n; k*=2) // Do log n times
for (j=1; j<=n; j ) // Do n times
sum1 ;`
sum2 = 0;
for (k=1; k<=n; k*=2) // Do log n times
for (j=1; j<=k; j ) // Do k times
sum2 ;
Я понимаю, что время выполнения первого цикла равно O (n) = nlog (n), но автор утверждает, что для второго цикла время выполнения равно O (n) = n.
Почему это так? Самое близкое, что я могу получить к ответу, это:
O(n) = k * log(n)
k = 2^i
O(n) = 2^i * log(n) ----> this is where I get stuck
Я предполагаю, что используется какое-то свойство логарифмов, но я не могу понять, какое именно. Может кто-нибудь указать мне правильное направление?
Спасибо.
Комментарии:
1. «O (n) = n log (n)» не имеет смысла. O (n) имеет очень специфическое значение. Вы не можете сказать, что оно равно n log (n).
Ответ №1:
Во втором примере сложность равна sum_j 2^j
, т.Е. Общему количеству операций во внутреннем цикле.
Как 2^j <= n
, есть logn
условия.
Эта сумма равна 2^{jmax 1} - 1
, 2^jmax
примерно (<=) равна n
.
Тогда, по сути, сложность O (2n) = O (n).
Ответ №2:
sum2
выполняется 1 2 4 8 … K раз, где K — наибольшая степень 2, меньшая или равная n. Эта сумма равна 2K-1.
Поскольку n / 2 < K <= n (поскольку K является наибольшей степенью 2, меньшей или равной n), количество итераций составляет от n-1 до 2n-1. Это тета (n), если вы хотите выразить это в асимптотической записи.