使用Big O表示法,此算法的正确标签是什么?

时间:2016-08-06 17:58:34

标签: algorithm time-complexity big-o

我很好奇使用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中此模式的正确名称是什么?

3 个答案:

答案 0 :(得分:5)

如果do something hereO(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)

答案 1 :(得分:5)

您可以使用Sigma表示法计算内循环的访问次数(“在此处执行操作”

enter image description here

来自summation rule made famous by the rumour that Gauss once derived it on-the-spot as a young studentdetach_item_from_user(item, user)

答案 2 :(得分:2)

要计算此算法的大O,只需想象一个形状: 在外部for循环的每次迭代中,我们有一行,由小方块组成。每个正方形是内循环的一次迭代。因此,对于外部for循环的第一次迭代,我们将有一整行的正方形。 第二排,将失去一个方格。 而第三排,将失去另一个。 ... 最后一行,只有一个正方形。 最后我们将有这样的形状:

⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜_____
⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜_______
⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜________
⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜_________
⬜⬜⬜⬜⬜⬜⬜⬜⬜__________
⬜⬜⬜⬜⬜⬜⬜⬜___________
⬜⬜⬜⬜⬜⬜⬜____________
⬜⬜⬜⬜⬜⬜_____________
⬜⬜⬜⬜⬜______________
⬜⬜⬜⬜_______________
⬜⬜⬜________________
⬜⬜_________________
⬜__________________

这是一个大广场的一半。所以它的领域是: prices.length *(prices.length - 1)* 1/2。 我们可以删除“-1”,因为它足够小。 结果如下: Price.length * prices.length * 1/2 1/2在Big O中并不重要。因此该算法具有O(n ^ 2)时间复杂度。