Ну, вначале: нотация Big O не связана с языком программирования, она зависит только от реализации. Так что это не имеет никакого значения, если вы делаете петли на Java или любом другом языке (кроме нескольких оптимизаций, выполняемых интерпретатором/компилятором, который, однако, изменить ход выполнения программы)
Для вложенного цикла:
1) sum++
считается постоянной операцией со стоимостью 1
. Поэтому его можно пренебречь. O(n * 1) = O(n)
2) Внешний контур остается примерно такой же, имеющим O(n-1)
, равная O(n)
как постоянные точек всегда можно пренебречь в асимптотических расчетах.
3) Внутренняя петля принимает log2(n)
шагов для завершения. На каждом шаге n
сводится к его половине, поэтому умножение на 2
делает один шаг назад, что приводит к двоичному логарифму.
В целом, сложность O(n log2(n))
EDIT: забавная вещь: не один до сих пор не видел, что внутренний цикл имеет реальную сложность O(infinity)
как разделение некоторого положительного числа не всегда больше, то 0
.. Или я здесь не прав?
На боковой ноте также проверьте это: http://stackoverflow.com/questions/3255/big-o-how-do-you-calculate-approximate-it –
Те постоянные операции времени в цикле вносят вклад в условия которые отбрасываются в оценке. – ChiefTwoPencils
Обратите внимание, что, если у вас нет скрытой дорогостоящей операции (например, 'get()' на 'LinkedList'), которая является результатом неверного предположения о библиотеке, язык не имеет отношения к анализу большого вывода. – chrylis