您如何找到代码拼写的算法复杂性?

时间:2017-03-10 17:13:26

标签: big-o asymptotic-complexity

我不知道这会是什么程序。我怎么想到这一点,我如何确定大O将会是什么?解决的过程是什么?

例1:

for ( i = 1; i <= n; i++)
  for (j = 1; j <= n*3; j++)
    System.out.println("Apple");

例2:

for (i = 1; i < n*n*n; i *=n) 
    System.out.println("Banana");

谢谢

2 个答案:

答案 0 :(得分:0)

简短的回答是你计算循环。如果没有循环,则它是O常量,如果有一个是O(N),如果有两个嵌套循环则为O(N平方),如果有三个则为O(N立方)。

然而,这只是简短的答案。您还可以使用循环,在每次迭代时将输入减少一半,因此这是一个log N项。并且你可以拥有尝试各种可能性的病态蛮力函数,这些函数是非多项式的。通常它们是为了大量使用递归而编写的,并且在每个递归步骤中都很难解决问题。

请注意,库函数通常不是O常量,必须将其考虑在内。

答案 1 :(得分:0)

Big-O衡量效率。所以说你要循环一个大小为n的数组,并说n是2,000。 O(n)表示您解决此问题的算法正在进行总计算总计2000次。对于您的算法,O始终是最糟糕的情况。还有其他符号用于最佳情况。你还有Ω(n)和Θ(n)。

检查一下,以了解效率的差异: http://bigocheatsheet.com/

非正式:

“T(n)T(n)T(n)是O(f(n))O(f(n))O(f(n))”基本上是指f(n)f(n) f(n)描述了T(n)T(n)T(n)的上界

“T(n)T(n)T(n)是Ω(f(n))\Ω(f(n))Ω(f(n))”基本上是指f(n)f(n )f(n)描述了T(n)T(n)T(n)的下界

“T(n)T(n)T(n)是Θ(f(n))\ Theta(f(n))Θ(f(n))”基本上是指f(n)f(n )f(n)描述了T(n)T(n)T(n)的精确界限

在简单的情况下解决这个问题的好方法是在n中插入几个简单的数字,看看会发生什么。所以说n是10号尺寸:

示例1中的

for ( i = 1; i <= n; i++) //loop through this n times
  for (j = 1; j <= n*3; j++) for each of those n times, loop through 3*n times
    System.out.println("Apple"); //negligible time (O(1))

如果只是外部循环,则为O(n)。但是,由于你添加了内部循环,你得到O(N ^ 2),因为虽然你的输入是(比方说)10,但是你正在做300(30个30 * 10中的每一个30次打印)操作。 3 * O(N ^ 2)但我们通常将3除外,因此O(n ^ 2)。大多数嵌套的循环你没有修改n 是O(n ^ 2)。

如果更容易,你可以把它想象成多项式3n * n = 3n ^ 2最坏的情况。

我会让你尝试下一个...暗示上面的粗体陈述。