Простой цикл 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))
в более читабельный форма:
после i-й итерации (i=0,1,...) значение a равно 32Я. Будет o(log log n) итераций, и, предполагая арифметические операции в O (1), это сложность времени.