Используя 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).

——————

Также взгляните на эти

  1. /questions/39713898/kakova-slozhnost-vremeni-naihudshego-sluchaya-dlya-etogo-algoritma/62321477#62321477
  2. /questions/39522799/vremennaya-slozhnost-vlozhennogo-tsikla-for/61824023#61824023
  3. /questions/59462490/on-i-funktsiya-vremennoj-slozhnosti-dannogo-koda/59574440#59574440
  4. /questions/10543993/chto-takoe-big-o-vlozhennogo-tsikla-gde-chislo-iteratsij-vo-vnutrennem-tsikle-opredelyaetsya-tekuschej-iteratsiej-vneshnego-tsikla/62055626#62055626
  5. /questions/40379058/vlozheno-dlya-tsikla-v-big-oh-complexity/62358542#62358542
Другие вопросы по тегам