Краткий ответ : если " какое-то утверждение " выполняется в постоянное время, то алгоритм B выполняется в O (n) .
Давайте сначала проанализируем внутренний цикл:
for(j=0; j<i; j++)
some statement
Поскольку j
повторяется от 0
(включительно) до i
(исключительно), это означает, что он будет таким образом выполнятьi
операций.
Теперь мы можем проанализировать внешнюю часть:
for(i=n; i>=1; i/=2)
// i operations
Здесь i
, таким образом, начинается с n
, каждый раз делится на 2
, и каждыйитерация, мы выполняем i
задач.
Таким образом, это означает, что общее количество задач составляет:
n + n/2 + n/4 + n/8 + ... + 1
Выше приведена известная последовательность:
m
---
\ -k -m
/ n * 2 = (2 - 2 ) n
---
k=0
Здесь k
, таким образом, варьируется от 0 до log 2 n , и, таким образом, общее количество инструкций составляет (2-2 ).log 2 n ) × n или (2 - 1 / n) × n и, следовательно, 2 × n - 1 .Мы можем упростить это до O (n) .