我很好奇使用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中此模式的正确名称是什么?
答案 0 :(得分:5)
如果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)
答案 1 :(得分:5)
您可以使用Sigma表示法计算内循环的访问次数(“在此处执行操作”)
来自summation rule made famous by the rumour that Gauss once derived it on-the-spot as a young student的detach_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)时间复杂度。