Вложено для цикла в Big Oh Complexity
for(int i = 0; i < n; i++) {
for(int j = 0; j < i; j++){
//do swap stuff, constant time
}
}
Я прочитал, что единственный цикл for равен O(N), и, пройдя его дважды, вы получите O(n^2). Я просмотрел соответствующие учебные пособия, в которых показано, что каждая операция занимает единицу 1 - O(1). Я хотел бы увидеть в деталях, как на самом деле подошел O(n^2). Я пытался сделать математику для каждого утверждения, но я считаю, что я делаю это неправильно. Я был бы признателен, если бы кто-то буквально показал мне, как вложенный цикл становится O(n^2). Заранее спасибо
4 ответа
Как вы упомянули
Каждый занимает единицу 1 - O(1)
Таким образом, каждая итерация внутреннего цикла занимает 1, 2, 3, ..., n единицу времени.
total_time = 1 + 2 + 3 + ... + (n-2) + (n-1) + n
Реверсивный
total_time = n + (n-1) + (n-2) + ... + 3 + 2 + 1
Добавление
2 * total_time = (n+1) + (n+1) + (n+1) + ... + (n+1) + (n+1) + (n+1)
Всего n терминов
2 * total_time = (n+1) * n
=> total_time = (n+1) * n / 2
=> total_time = n^2 / 2 + n / 2
Меньшие члены и постоянные коэффициенты игнорируются для большой сложности O.
В следствии
O (N ^2)
for(int i = 0; i < n; i++){ // outer loop
for(int j = 0; j < i; j++){ // inner loop
//do swap stuff, constant time
}
}
В первой итерации внешнего цикла (i = 0) внутренний цикл не выполняется.
Во второй итерации внешнего цикла (i = 1) выполняется внутренний цикл
once
.
На третьей итерации внешнего цикла (i = 2) выполняется внутренний цикл
twice
.
Итак, на последней итерации внешнего цикла (i = n) выполняется внутренний цикл
n times
.
Таким образом, общее количество выполнений этого кода равно
1 + 2 + 3 + … + n
= n(n + 1) / 2
(Формула суммы натуральных чисел)
= ((n^2) + n) / 2
= O(n^2)
——————
Также взгляните на эти
- /questions/39713898/kakova-slozhnost-vremeni-naihudshego-sluchaya-dlya-etogo-algoritma/62321477#62321477
- /questions/10543993/chto-takoe-big-o-vlozhennogo-tsikla-gde-chislo-iteratsij-vo-vnutrennem-tsikle-opredelyaetsya-tekuschej-iteratsiej-vneshnego-tsikla/62055626#62055626
- /questions/39522799/vremennaya-slozhnost-vlozhennogo-tsikla-for/61824023#61824023
- /questions/21671824/ispolzuya-big-o-notation-kakova-pravilnaya-metka-dlya-etogo-algoritma/62348199#62348199
- /questions/59462490/on-i-funktsiya-vremennoj-slozhnosti-dannogo-koda/59574440#59574440
Вам нужно использовать древнее и неясное искусство математики и рассчитать, сколько раз выполнено внутреннее утверждение.
В вашем случае внутренний цикл выполняется i раз. Значения для i равны 0, 1, 2, ..., n-1. Итак, вам нужна формула, которая рассчитывает эту сумму, и это ваш результат.
Вы читаете, что один цикл - это O (n). Это чепуха. Это зависит от цикла.
for (i = 1; i < n; i *= n)
не повторяется n раз. Он повторяет log2 (n) раз, что обычно намного меньше. Вам нужно посмотреть на реальный код и выяснить это. Для этого нет простого правила.
Функция, которая переходит от i = 1 к n, а затем имеет внутренний цикл, который переходит от 1 до i, будет идти, хотя число итераций равно этой формуле:
п (п +1)/2
Как вы видите, когда мы избавляемся от всего, кроме основного показателя, вы заканчиваете O(n^2)