2012-01-17 3 views
6

Какова сложность, заданная для следующей проблемы: O (n). Не должно быть O (n^2)? Это потому, что внешний цикл O (n), а внутренний также O (n), поэтому n * n = O (n^2)?Сложность алгоритма

В листе ответов на этот вопрос указано, что ответ O (n). Как это возможно?

public static void q1d(int n) { 
    int count = 0; 
    for (int i = 0; i < n; i++) { 
     count++; 
     for (int j = 0; j < n; j++) { 
      count++; 
     } 
    } 
} 

Сложность для следующей проблемы: O (n^2), как вы можете это получить? Может кто-то прокомментировать?

public static void q1E(int n) { 
    int count = 0; 
    for (int i = 0; i < n; i++) { 
     count++; 
     for (int j = 0; j < n/2; j++) { 
      count++; 
     } 
    } 
} 

Благодаря

+0

Я думаю, что верхний - это O (n^2). И какое сомнение у вас есть о втором? – WordsWorth

+0

Это означает, что ответ моего профессора неверен. – Harminder

+2

похоже, что на листе ответов есть ошибки. – Zohaib

ответ

6

Сложность как код О (п * п)

ПЕРВЫЙ

Внешний контур работает n раз, а внутренний цикл изменяется от 0 to n-1 раза

so

total = 1 + 2 + 3 + 4 ... + n

, который, если вы добавите arithmetic progression является n * (n + 1)/2 является O(n*n)

ВТОРОЙ

Внешний цикл проходит n раз, а внутренний цикл колеблется от 0 to n-1/2 времен

так

total = 1 + 1/2 + 3/2 + 4/2 ... + n/2

, который, если вы добавите арифметическую прогрессию является n * (n + 1)/4 также O(n*n)

+0

Итак, если n/2 все равно равно o (n)? Но итерация для внутреннего цикла составляет половину внешнего цикла, что имеет значение? – Harminder

+1

@ user1085135: 'O (n)' имеет значение 'linear'. Не имеет значения, с какой постоянной она умножается, что имеет значение только потому, что она ** линейна. – zerkms

15

Первый пример O(n^2), так что кажется, что они совершили ошибку. Чтобы рассчитать (неофициально) второй пример, мы можем сделать n * (n/2) = (n^2)/2 = O(n^2). Если это не имеет смысла, вам нужно пойти и освежить то, что означает что-то, что есть O(n^k).

2

Первый случай определенно O(n^2)

Второй O(n^2), а потому что вы опускаете константы, когда вычисления большой O

0

Ваш ответ лист не так, первый алгоритм, очевидно, O (N^2).

Знак Big-Oh «наихудший случай», поэтому при вычислении значения Big-Oh мы обычно игнорируем умножения/деления на константы.

При этом ваш второй пример также является O (n^2) в худшем случае, поскольку, хотя внутренний цикл является «единственным» 1/2 n, n является четким ограничивающим фактором. На практике второй алгоритм будет меньше операций O (n^2), но Big-Oh предназначен для измерения «наихудшего случая» (т. Е. Максимального ограничения), поэтому точное число операций игнорируется в пользу сосредоточив внимание на том, как работает алгоритм, когда n приближается к бесконечности.

+0

Второй алгоритм не будет меньше O (n^2), это * точно * O (n^2). Я подозреваю, что вы не совсем поняли, что означает «O (n^2)». Это означает, что по мере того, как 'n' стремится к бесконечности, время выполнения для алгоритма для двух значений' n' пропорционально разнице между этими квадратами значений n. –

+0

Нет. На практике фактическая временная сложность алгоритма будет немного меньше O (n^2). Однако, поскольку Big-Oh - максимальная граница, мы говорим, что это O (n^2). Вы правы, что коэффициент n/2 явно ограничен n - как я указал в своем ответе. Существуют другие ограничивающие измерения (т. Е. Big-Theta), которые вычисляют ограничивающий множитель по-разному. – debracey

+0

Почему, по вашему мнению, фактическая временная сложность алгоритма будет меньше O (n^2)? Я утверждаю, что это будет * точно * O (n^2), потому что сложность алгоритма * точно * соответствует * определению * O (n^2). Если это не * точно * O (n^2), то ничего нет. Мы говорим *, что это O (n^2), потому что это ** является ** O (n^2). Кажется, вы хотите сделать это нечетким, запутанным и неточным, когда оно абсолютно, кристально чисто. –

0

Оба являются O(n^2). Ваш ответ неправильный. Или вы можете написать вопрос неправильно.

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