Великий O: Вкладений для циклу із залежністю


9

Мені дали домашнє завдання з Big O. Я застряг з вкладеними петлями, які залежать від попереднього циклу. Ось змінена версія мого домашнього запитання, оскільки я дуже хочу його зрозуміти:

sum = 0;
for (i = 0; i < n; i++ 
    for (j = 0; j < i; j++) 
        sum++;

Частина, яка мене скидає - це j < iчастина. Здається, він би виконувався майже як фактор, але з доповненням. Будь-які підказки були б дуже вдячні.


Приємне пояснення тут
saadtaame

Відповіді:


10

Тож дозвольте мені уточнити кілька речей, вас цікавить нотація big-O - це означає верхню межу . Іншими словами, добре рахувати більше кроків, ніж ви насправді робите. Зокрема, ви можете змінити алгоритм на

 ...
    for (j = 0; j < n; j++) 
 ...

Таким чином , у вас є два вкладених циклу, кожен цикл виконується раз, що дає вам верхню межу знО(н2)

Звичайно, ви хочете мати хорошу оцінку для верхньої межі. Тож для завершення ми хочемо визначити нижню межу. Це означає, що добре рахувати менше кроків. Тож розглянемо модифікацію

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

Тут ми виконуємо лише деякі петлі-ітерації. Знову у нас є дві вкладені петлі, але на цей раз у нас є ітерації на цикл, що показує, що у нас є принаймні доповнення. У цьому випадку позначимо цю асимптотичну нижню межу через . Оскільки нижня і верхня межа збігаються, ми навіть можемо сказати, що - це щільна асимптотична межа, і ми пишемо .н/2н2/4Ω(н2)н2Θ(н2)

Якщо ви хочете дізнатися більше, читайте тут .


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

Давайте простежимо це:

  • Коли i = 0, внутрішній цикл не працюватиме взагалі ( 0<0 == false).
  • Коли i = 1, внутрішня петля запуститься один раз (для j == 0).
  • Коли i = 2, внутрішня петля запуститься двічі. (для j == 0 і j == 1).

Таким чином, цей алгоритм збільшуватиметься sumу таку кількість разів:

х=1нх-1=0+1+2+3+4 ...+н-1=н(н-1)2

За допомогою перевірки ми можемо побачити, що сума - це «трикутне число». Поширюючин до решти чисельника ми доходимо н2-н2, з яких термін, що найбільш швидко зростає н2 отже, складність Бахмана-Ландау у великій теті θ(н2)О(н2) анг Ω(н2).


3

давайте подивимось, чи можу я пояснити це ...

Отже, якщо внутрішня петля була j

Тепер для першої ітерації ви робите n- (n-1) разів через внутрішню петлю. вдруге ви робите n- (n-2) рази через внутрішню петлю. У N-й раз ви робите n- (nn) разів через, що в n разів.

якщо ви в середньому кількість разів проходите через внутрішню петлю, це було б n / 2 рази.

Отже, ви можете сказати, що це O (n * n / 2) = O (n ^ 2/2) = O (n ^ 2)

Чи має це сенс?


Це трохи дивно, але я думаю, що я це зрозумів! Дякую! Може зайняти трохи часу, щоб потонути весь шлях у ха-ха

Отже, якби ця j < iчастина була насправді j < i^2, отримана O для цієї частини була б n ^ 2/2?

Перш за все зауважимо, що O (n ^ 2/2) = O (n ^ 2). Тепер, якщо ви зміните його на j <i ^ 2, то ви робите (n- (n-1)) ^ 2 на першій ітерації та n ^ 2 на останній ітерації. Я не пам’ятаю, якою буде велика нотація O для внутрішньої петлі. O (n ^ 2) - вільна верхня межа. Отже, вільною верхньою межею для всієї речі було б O (n ^ 3), але ця внутрішня петля менша, ніж O (n ^ 2). Чи має це сенс?
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.