Посмотрите на
n = n // 2
или
i = i * 2
Деление (n = n // 2
) уменьшает n
намного быстрее , а затем вычитание (n = n - 1
). Ваше решение O(N**2)
было бы правильным для n = n - 1
; для деления (n = n // 2
) имеем
n = N
while n > 0:
for i in range(0, n):
sum += 1;
n = n // 2
Давайте развернем внешнее l oop (while n > 0:
)
0..N - N items to sum
0..N / 2 - N/2 items to sum
0..N / 4 - N/4 items to sum
...
0..N / 2**p - N/2**p items to sum
...
0..N / 2**(log N) - 1 item to sum
Итак, имеем ( верхняя граница ):
N * (1 + 1/2 + 1/4 + ... 1/2**p + ...) = 2 * N = O(N)
текучая известь линейная .