Подтвердить что ты не робот

Домашнее задание о большой O-ноте - анализ алгоритма фрагмента кода?

Для домашней работы мне дали следующие 8 фрагментов кода для анализа и представления знака Big-Oh для времени выполнения. Может кто-нибудь, пожалуйста, скажите мне, если я на правильном пути?

//Fragment 1
for(int i = 0; i < n; i++)
    sum++;

Я думаю O (N) для фрагмента 1

//Fragment 2
for(int i = 0; i < n; i+=2)
    sum++;

O (N) для фрагмента 2, а также

//Fragment 3
for(int i = 0; i < n; i++)
    for( int j = 0; j < n; j++)
        sum++;

O (N ^ 2) для фрагмента 3

//Fragment 4
for(int i = 0; i < n; i+=2)
    sum++;
for(int j = 0; j < n; j++)
    sum++;

O (N) для фрагмента 4

//Fragment 5
for(int i = 0; i < n; i++)
    for( int j = 0; j < n * n; j++)
        sum++;

O (N ^ 2) для фрагмента 5, но n * n отбрасывает меня, поэтому я не уверен.

//Fragment 6
for(int i = 0; i < n; i++)
    for( int j = 0; j < i; j++)
        sum++;

O (N ^ 2) для фрагмента 6 также

//Fragment 7
for(int i = 0; i < n; i++)
    for( int j = 0; j < n * n; j++)
        for(int k = 0; k < j; k++)
            sum++;

O (N ^ 3) для фрагмента 7, но снова n * n выбрасывает меня

//Fragment 8
for(int i = 1; i < n; i = i * 2)
    sum++;

O (N) для фрагмента 8

4b9b3361

Ответ 1

Я думаю, что фрагмент 5 есть O (n ^ 3), и аналогичным образом фрагмент 7 равен O (n ^ 5) *. Он также выглядит как O (log (n)) для фрагмента 8.

Для n * n задач вам нужно выполнить тело цикла n * n раз, поэтому это будет O (n ^ 2), тогда вы соедините это с порядком другого кода. Фрагмент 8 фактически удваивает счетчик вместо того, чтобы увеличивать его, поэтому чем больше проблема, тем меньше требуется выполнить дополнительную работу, поэтому O (log (n))

* edit: Фрагмент 7 равен O (n ^ 5), а не O (n ^ 4), как я думал ранее. Это связано с тем, что и j , и k идут от 1 до n * n. Извините, я не понял этого раньше.

Ответ 2

Фрагмент 7 равен O (n ^ 5), а не O (n ^ 4) в качестве принятых в настоящее время комментариев. В противном случае, это правильно.

Ответ 3

В случае 8 попробуйте записать количество итераций для некоторых значений N и посмотреть, как выглядит шаблон... это не O (N)

Ответ 4

Вы оказались на правильном пути. Что касается N * N, какой эффект, по вашему мнению, будет иметь? Это еще один фактор N, поэтому он, вероятно, будет более высокого порядка.

Просто предупреждение, я видел еще одну запись, как это, и она была крайне проголосована. Быть осторожен. Здесь - это сообщение.

Ответ 5

Вы на правильном пути, но вот подсказка о том, как все может стать яснее на этом пути. Предположим, у вас есть код:

for(i = 0; i < n; i++) {
   for(j = 0; j < 100; j++){....}
}

Правильно, учтите тот факт, что у вас есть код на разных уровнях. В этом примере вы можете видеть только 3 уровня:

  • Внешний для цикла, который идет от 0-n
  • Другой для цикла, который идет от 0-100
  • Код внутри, который помечен как ...

Ни в коем случае не пытайтесь вычислить все это в 1 раз. Именно здесь большинство новичков совершают какую-то арифметическую ошибку. Вычислите его индивидуально для каждого уровня, а затем умножьте все вместе.

Удачи!