Используя Big O Notation, какова правильная метка для этого алгоритма?
Мне интересно, как официальный способ описать это, используя Big O Notation?
var prices = [100, 180, 260, 590, 40, 310, 535, 10, 5, 3];
var biggest_profit = 0;
for (var i=0; i < prices.length; i++) {
var first_price = prices[i];
for (var j=i+1; j <= prices.length; j++) {
// do something here
}
}
Это то, что меня отталкивает:
j=i+1
Каждый раз, когда мы проходим i
, j
становится все короче и короче.
Какое правильное название для этого паттерна в Big O Notation?
4 ответа
Вы можете использовать сигма-нотацию для расчета количества посещений внутреннего цикла ("сделайте что-нибудь здесь")
куда (*)
Из правила суммирования, известного благодаря слухам, следует, что Гаусс однажды получил его на месте, будучи молодым студентом.
Если do something here
является O(1)
операция, весь алгоритм O(N^2)
,
Как рассчитать? (Спасибо @dfri за отлов ошибок)
Внешний цикл: i: [0->N-1]
Внутренний цикл: j: [i+1->N]
Всего = N + (N-1) + (N-2) + (N-3) + ... + 1 = N(N+1)/2 = O(N^2)
Чтобы вычислить большую O этого алгоритма, просто представьте форму: в каждой итерации внешнего цикла for у нас есть строка, состоящая из маленьких квадратов. Каждый квадрат - это одна итерация внутреннего цикла for. Так что для первой итерации внешнего цикла for у нас будет полная строка квадратов. Второй ряд, потеряет один из квадратов. А третий ряд потеряет еще один.... В последнем ряду будет только один квадрат. В итоге мы получим эту форму:
⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜_____
⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜_______
⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜________
⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜_________
⬜⬜⬜⬜⬜⬜⬜⬜⬜__________
⬜⬜⬜⬜⬜⬜⬜⬜___________
⬜⬜⬜⬜⬜⬜⬜____________
⬜⬜⬜⬜⬜⬜_____________
⬜⬜⬜⬜⬜______________
⬜⬜⬜⬜_______________
⬜⬜⬜________________
⬜⬜_________________
⬜__________________
Это половина большого квадрата. Таким образом, его площадь составляет: цена. Длина * (цены. Длина - 1) * 1/2. И мы можем удалить "-1", потому что это достаточно мало. И результат: Цены. Длина * Цены. Длина * 1/2. 1/2 не важна в Big O. Таким образом, алгоритм имеет O(n^2) временную сложность.
var prices = [100, 180, 260, 590, 40, 310, 535, 10, 5, 3];
var biggest_profit = 0;
for (var i = 0; i < prices.length; i++) { // outer loop
var first_price = prices[i];
for (var j = i + 1; j <= prices.length; j++) { // inner loop
// do something here
}
}
В первой итерации внешнего цикла (i = 0) внутренний цикл выполняется несколько раз.
Во второй итерации внешнего цикла (i = 1) внутренний цикл выполняется несколько раз.
В третьей итерации внешнего цикла (i = 2) внутренний цикл выполняется несколько раз.
. . .
На й итерации внешнего цикла (i = N - 3) выполняется внутренний цикл
3
раз.
В й итерации внешнего цикла (i = N - 2) внутренний цикл выполняется несколько раз.
В последней (й) итерации внешнего цикла (i = N - 1) внутренний цикл выполняется time.
Таким образом, общее количество выполнений этого кода равно
+ + + + … + +
знак равно
1
+
2
+ … +
N - 3
+
N - 2
+
N - 1
+
N
Подставив это в формулу суммы натуральных чисел,
знак равно
(N)(N + 1) / 2
знак равно
((N^2) + N) / 2
знак равно
O(N^2)
, предполагая
// do something here
выполняется за постоянное время
O(1)
.
——————
Также взгляните на эти
- /questions/39713898/kakova-slozhnost-vremeni-naihudshego-sluchaya-dlya-etogo-algoritma/62321477#62321477
- /questions/39522799/vremennaya-slozhnost-vlozhennogo-tsikla-for/61824023#61824023
- /questions/59462490/on-i-funktsiya-vremennoj-slozhnosti-dannogo-koda/59574440#59574440
- /questions/10543993/chto-takoe-big-o-vlozhennogo-tsikla-gde-chislo-iteratsij-vo-vnutrennem-tsikle-opredelyaetsya-tekuschej-iteratsiej-vneshnego-tsikla/62055626#62055626
- /questions/40379058/vlozheno-dlya-tsikla-v-big-oh-complexity/62358542#62358542