分析我的程序的时间复杂性

时间:2011-03-11 06:30:01

标签: algorithm complexity-theory

我在确定算法的时间复杂性方面存在问题。

for(int i=0;i <n i++){}   O(n)

for(int i= 0 ;i<n ;i++){    O(n^2)
  for(int j=0;j<n;j++){ 

  }
}

现在,对于下面的代码来说,复杂性是什么

for(i =0; i<n ; i++) {}
for (j=0;j<n ;j++ ) {} 

它是O(2n)因为它会发出2个单独的循环吗?

如果我开始j = 5到n?

怎么办?

6 个答案:

答案 0 :(得分:8)

没有O(2n),只是O(n)。换句话说,它的扩展速度与n增加的速度相同。

如果是嵌套循环,它将是O(n2),但是{}空块的存在意味着它没有嵌套。

无论你是从一个还是五个开始都没有区别,它仍然会与n一起扩展,只是稍加负的常量加法。因此仍然是O(n)

复杂性O(n)O(cn)O(n+c)(其中c是常量)都是等价的。此外,您通常也只使用效果最高的术语。

因此,您通常不会看到O(7n3 + 3n2 + 12n + 2),这会简化为O(n3)

答案 1 :(得分:1)

最终的结果是,通过一些我不记得的花哨的数学,你能够把像2n这样的东西变成大O(n)。系数被认为是常数,因为我们关注的是复杂性,当单独处理这个问题时,你需要检查导致最大增长的方程的一部分。在这种情况下,Big O(n ^ 2)是等式复杂度中最主要的元素。因此,您的算法被认为是Big O(n)。

我的道歉,基于误读最后一行代码的小错字。你问过的那个是Big O(n)

答案 2 :(得分:1)

没有O(2n)这样的东西。时间复杂度是指算法如何扩展到无穷大,而不是实际运行时间。在您的示例中,您有两个线性[O(n)]时间的循环,这意味着它们将与输入线性缩放,因此您的整体算法为O(n)。

如果你开始j = 5,它仍然是O(n),因为它仍然是线性缩放。

所以实质上,O(2n)== O(n)。

答案 3 :(得分:1)

当且仅当n的值非常大时,有两个重要的时间复杂规则适用...

  1. 高阶项的系数可以忽略不计。

  2. 所有低阶词都可以被igonred。

  3. 为什么这些假设很简单,让我们考虑一个例子: -

    假设时间复杂度为5n ^ 2 + 3n。在非常低的n值下,系数和低阶项在n的小变化中变得突出。但是假设如果n的值非常大,则低阶项对时间复杂度的影响非常小,而且最高阶项的系数也可以用同样的方式忽略。

    注意时间复杂性只有在n理论上接近无穷大时才起主要作用。

答案 4 :(得分:0)

是的,它是O(2n),但是它与O(n)相同,因为乘以常数与渐近复杂度无关。类似地,如果你跳过五个第一个元素,你的循环需要O(n-5)个时间,但是它也与O(n)相同,因为加一个或减去一个常数甚至比乘以一个常数要弱。参见例如http://en.wikipedia.org/wiki/Big_O_notation用于定义。

答案 5 :(得分:0)

复杂性是描述关系输入n和时间的函数形状的度量。

请记住,在大多数情况下,你不知道是不变的。如果比较两个可比较的算法,你可以使用常数,但在大多数情况下,你会引用通用的复杂性并测量一些输入n的时间。在你的情况下,O(2 * n)与2 * O(n)相同,这只是O(n),因为2 * O(n)并没有说太多,可以使用常数2进行比较算法。说第二种算法具有复杂度2 * O(n)并没有多大意义。

以这种方式看待复杂性。

让我们说你的算法需要n = 100万。 什么是近似大小或操作次数顺序

O(n)            -> 1e6   and this can be calculated in most cases  
O(n * log(n))   -> 2*1e7 this can also be calculated in reasonable time.
O(n^2)          -> 1e12  you will not be able to compute whit this algorithm in reasonable time
O(n^3)          -> 1e18  here are so many operations that you have to think twice on how you are going to aproach this problem