2013-10-15 3 views
0

Освежающие на сложность алгоритма, я смотрел на этот пример:вывод алгоритма сложности

int x = 0; 
    for (int j = 1; j <= n; j++) 
     for (int k = 1; k < 3*j; k++) 
      x = x + j; 

Я знаю, что петли заканчивается время O (N^2). Я полагаю, что внутренний цикл выполняется 3 * n раз (3 (1 + 2 + ... n)), а внешний цикл выполняется n раз. Итак, O (3n * n) = O (3n^2) = O (n^2).

Однако источник, на который я смотрю, расширяет выполнение внутреннего цикла до: 3(1+2+3+...+n) = 3n^2/2 + 3n/2. Может ли кто-нибудь объяснить время исполнения 3n^2/2 + 3n/2?

+0

Не сказал, что вы не получите здесь хорошего ответа, но может быть лучше для http://cs.stackexchange.com – yamafontes

+0

вы можете уточнить, что вы спрашиваете? Почему «3n^2/2 + 3n/2' является O (n^2) или почему это может выполняться много раз? – Adam

+0

Конечно. Почему он выполняет '3n^2/2 + 3n/2'? Я не понимаю деление на 2. – DashControl

ответ

1

Для каждого J вы должны выполнить итерации J * 3 внутреннего цикла, так что команда x=x+j будет выполнена, наконец, n * 3 * (1 + 2 + 3 ... + n) раз, сумма Arithmetic progression равна n * (п + 1)/2, так что вы команда будет выполняться:

3 * n * (n+1)/2 which is equals to (3*n^2)/2 + (3*n)/2

но большая O не то, сколько итераций будут, речь идет о асимптотических мерах, поэтому в выражении 3 * N * (n + 1)/2 необходимо удалить consts (установить их все в 0 или 1), поэтому мы имеем 1 * n * (n + 0)/1 = n^2

Небольшое обновление о большом O calculatio п для этого случая: сделать большой вывод из 3n (п + 1)/2, для большого O вы можете себе представить, чем N равно бесконечности, так:

infinity + 1 = infinity 
3*infinity = infinity 
infinity/2 = infinity 
infinity*infinity = infinity^2 

так что вы после этого у вас есть N^2

+0

Спасибо! Я полностью забыл об этом свойстве в отношении суммирования. – DashControl

+0

@GVIPProgrammer его нормально, я лично всегда проверяю такие формулы :) проверьте обновление количества итераций и больших O –

+0

Последний последний вопрос. Что касается одиночных циклов, которые являются O (N). Используя в качестве основы n * (n + 1)/2, не будет ли оно равно n^2/2 + n/2? – DashControl

1

Big O Обозначение дает верхнюю оценку асимптотического времени работы алгоритма. Он не учитывает члены нижнего порядка или постоянные факторы. Поэтому O (10n) и O (1000n + 4n + 56) все еще O (n).

Что вы делаете, это попытка подсчитать количество операций в вашем алгоритме. Однако Big O ничего не говорит о точном количестве операций. Он просто дает вам верхнюю границу времени наихудшего случая, которое может иметь место при неблагоприятном вводе.

1

Сумма целых чисел от 1 до m равна m * (m + 1)/2. В данной задаче j идет от 1 до n, а k переходит от 1 до 3 * j. Таким образом, внутренний цикл на k выполняется 3 * (1 + 2 + 3 + 4 + 5 + ... + n) раз, причем каждый член в этой серии представляет одно значение j. Это дает 3n (n + 1)/2. Если вы расширите это, вы получите 3n^2/2 + 3n/2. Тем не менее, все дело в O (n^2). Вам все равно, будет ли ваше время выполнения как квадратично, так и линейно, так как линейка затухает квадратичной.

1

Точная точность вашего алгоритма можно найти с помощью Sigma обозначения, как это:

enter image description here

Это было эмпирически подтверждено.

Смежные вопросы