Простой цикл while алгоритмическую сложность

int a = 3;

while (a <= n) {
    a = a * a;
}

моя версия заключается в том, что ее сложность:
http://www.mmoprophet.com/stuff/big-o.jpg
Есть ли такая вещь?

4 ответов


Это неправильно. a не может быть частью Формулы big-O, так как это всего лишь временная переменная.

с моей головы, если мы возьмем умножение как операцию постоянного времени, то количество выполненных умножения будет O (log log n). Если бы вы умножали на константу каждую итерацию, то это было бы O (log n). Потому что вы умножаете на растущее число каждую итерацию, тогда есть еще одно бревно.

подумайте об этом как о количестве цифр, удваивающих каждую итерацию. Сколько раз вы можете удвоить количество цифр, прежде чем превысить лимит? Количество цифр-log n и вы можете удвоить начальные цифры log2 log n раза.


Что касается другого аспекта вопроса, да, O (a-ой корень n) может быть допустимым классом сложности для некоторой константы a. Это было бы более фамильярно написано как O (n1/a).


Ну, вы действительно можете войти в бесконечный цикл!

предположим 32-разрядные целые числа:

попробуйте это:

int a = 3 ;
int n = 2099150850;
while (a <= n)
{
    a = a*a;
}

но предполагая, что нет целочисленных переполнений, другие плакаты правы, Это O(log logn), если вы предполагаете умножение O(1).

простой способ увидеть это:

xn+1 = xn2.

возьмите x1 = a.

С системный журнал.

tn = log xn

затем tn+1 = 2tn

становится интереснее, если учесть сложность умножения двух K разрядных чисел.


число итераций цикла составляет Ο (log log n). Тело цикла само выполняет назначение (которое мы можем считать постоянным) и умножение. Самый известный алгоритм умножения до сих пор имеет сложность шага Ο (N log N×2Ο (log* n)), так, все вместе, сложность что-то вроде:

Ο (log log n × n log N×2Ο (log* n))

в более читабельный форма:

Ο (log log n × n log N×2^Ο (log* n)) http://TeXHub.Com/b/TyhcbG9nXGxvZyBuXCxcdGltZXNcLG4gXGxvZyBuXCxcdGltZXNcLDJee08oXGxvZ14qIG4pfSk=


после i-й итерации (i=0,1,...) значение a равно 32Я. Будет o(log log n) итераций, и, предполагая арифметические операции в O (1), это сложность времени.