我不知道这会是什么程序。我怎么想到这一点,我如何确定大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");
谢谢
答案 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最坏的情况。
我会让你尝试下一个...暗示上面的粗体陈述。