Ваши расчеты частично верны. Вы просто пропускаете небольшую деталь, в которой вы уже вычислили сложность внешнего цикла. В вашем случае вы решили рассчитать сложность времени, просто вычислив время, когда каждая итерация во внешнем цикле принимает. И это:
for i=n : O(n)
for i=n/2: O(n/2)
.
.
.
for i=1: O(1)
Теперь расчеты для каждой итерации, где сделаны на основе временной сложности внутренней петли. Таким образом, общая временная сложность заключается в том, сколько занимает внешний цикл (который включает время, в течение которого выполняется внутренний цикл), что является суммой того, сколько требуется для запуска каждой итерации, которая равна: n+n/2+n/4+...+1
.
Умножение, на которое вы ссылались, является методом, используемым, когда вы знаете, сколько раз выполняется внешний цикл и сколько раз выполняется внутренний цикл, и вы умножаете их, чтобы получить общую временную сложность.Вы могли бы использовать альтернативу, добавив количество раз, когда внутренний цикл запускается до себя n раз, тогда как n - это количество циклов, выполняемых внешним циклом (простая математика: k * n = k + k + ... + k n раз).
Итак, в вашем случае вы просто используете второй метод, так как n + n/2 + n/4 + ... + 1 - это не количество циклов, в течение которых выполняется внутренний цикл, это сумма сколько раз он запускается на каждой итерации внешнего цикла.
Возможный дубликат [Big O, как вы его вычисляете/приближаете?) (Http://stackoverflow.com/questions/3255/big-o-how-do-you-calculate-approximate-it) –