渐近分析与大O

时间:2018-09-20 20:01:19

标签: java time-complexity big-o complexity-theory

让我们考虑以下功能:

int foo(int n) {
  int x = 0;
  for(int i = 0; i < n; i++) {
    for(int j = 0; j < n; j++) {
        x -= 1;
    }
  }

  x = 0;

  for(int i = 0; i < n; i++) {
    x += 1;
  }
  return x;
}

根据Big O表示法,此函数的运行时复杂度为(我会非常精确):

O(1 + N^2 + 1 + N) = O(N^2)

N与算法运行时上限之间的依赖关系等于:

1 + N^2 + 1 + N

根据this文章,渐近分析让我们删除常数和非主导项。因此结果依赖项将是:

1 + N^2 + 1 + N = N^2

与Big O表示法相同。

但是根据this的演讲,渐近分析不允许我们丢弃非非主导项的常量,因此,如果我想使用渐近分析来评估此表达式,我将得到:

1 + N^2 + 1 + N 

我很困惑,因为直到现在,我完全确定渐近分析和Big O是同一件事。 因此,我有两个问题:

  1. Big O表示法和渐近分析之间有什么区别?
  2. 其中有两篇在说谎?

1 个答案:

答案 0 :(得分:0)

  

Big O表示法和渐近分析之间有什么区别?

渐近分析是一种用于我们分析一种算法是否运行时间随输入大小而扩展的算法,该算法是否比另一种“更快”。它只适合大输入,但是它可以抽象掉可能影响算法速度的外部因素,例如硬件,语言和其他问题。

例如,如果我使用“更快”算法并且列表足够长,则可以比supercomputer更快地手动排序列表。

但是我们如何比较两种算法的性能呢?共有三种度量:Big O,Big Omega和Big Theta。有关详细说明,请参阅this answer

  

其中有两篇在说谎?

我认为您已在评论中找到答案。