Сложность по времени составляет , а не O (log n) , это O (n) .
.структурированный способ.Сначала мы рассмотрим внутренний цикл:
for (j = 1; j < i; j++)
printf_s("*");
Здесь j
повторяется от 1
до i
.Таким образом, это означает, что для данного i
потребуется i-1
шагов.
Теперь мы можем посмотреть на внешний цикл и абстрагировать внутренний цикл:
while (i<=n)
{
// ... i-1 steps ...
j *= 2;
i *= 3;
}
Итак, на каждой итерации цикла while
мы выполняем i-1
шагов.Кроме того, на каждой итерации i
удваивается, пока не станет больше n
.Таким образом, мы можем сказать, что число шагов этого алгоритма:
log3 n
---
\ k
/ 3 - 1
---
k=0
Мы используем k
в качестве дополнительной переменной, которая начинается с 0
и каждый раз увеличивается.Таким образом, он подсчитывает, сколько раз мы выполняем тело цикла while
.Это закончится, когда 3^k > n
, поэтому мы будем повторять лог 3 ( n ) раз, и каждую итерацию внутренний цикл будет перезапускать в 3 k -1 шагов.
Приведенная выше сумма эквивалентна:
log3 n
---
\ k
-log3 n + / 3
---
k=0
Выше приведена геометрическая серия [wiki] , что равно: (1-3 log 3 n ) / (1-3) , или упрощенно, оно равно (n log 3 3 -1) / 2 и, следовательно, (n-1) / 2 .
Итогоколичество шагов, таким образом, ограничено: (n-1) / 2 - log 3 n или сформулировано проще O (n) .