什么是大O符号,我该如何计算?

时间:2015-03-25 16:44:29

标签: algorithm

计算大功能。如何计算此函数中的大O符号?

实施例:

function fun1(int n)
{
  int s = 0;
  for(int i = 0; s < n; i++)
  {
    s += i;
    for(var j = s; j < n; j++)
      {
        console.log(j);
      }
  }
  return s;
}

1 个答案:

答案 0 :(得分:1)

粗略地说,考虑外循环的i次迭代。执行循环体后,

s = 1 + 2 + ... +  i-1 + i

由高斯的同一性等于i*(i+1)/2 = (i²+i)/2i使得该表达式小于n的最大值可以通过如下的基本计算获得。如果我们需要

(i²+i)/2 <= n

表示

i²+i-2n <= 0

我们可以使用reduced quadratic equation的公式来获取

i <= -1/2 + sqrt(1/4+2n)

位于O(n^{1/2})。在外循环的每次迭代中,内循环进行n-s次迭代,这可以通过n非常粗略地估计(但这非常不精确,我相信整体分析可以更加精确)。总的来说,这会产生O(n^{1/2}*n)=O(n^{3/2})的界限。