Loops 查找具有多个嵌套循环的Big-O? int num=n/4; 对于(int i=1;i
Loops 查找具有多个嵌套循环的Big-O? int num=n/4; 对于(int i=1;i,loops,nested,big-o,Loops,Nested,Big O,O((n^3)/4)在大O表示法中没有意义,因为它是用来衡量作为参数比率的复杂性的。除以4没有任何效果,因为这会改变比率的值,但不会改变其性质 所有这些都是等效的: int num = n/4; for (int i = 1; i <= num; i++) { for (int j = 1; j <= n; j++) { for (int k = 1; k <= n; k++) { int count = 1; }
O((n^3)/4)
在大O表示法中没有意义,因为它是用来衡量作为参数比率的复杂性的。除以4没有任何效果,因为这会改变比率的值,但不会改变其性质
所有这些都是等效的:
int num = n/4;
for (int i = 1; i <= num; i++) {
for (int j = 1; j <= n; j++) {
for (int k = 1; k <= n; k++) {
int count = 1;
}
}
}
其他术语只有在包含n
术语时才有意义,例如:
O(n^3)
O(n^3/4)
O(n^3*1e6)
正如Anthony Kanago正确指出的那样,按照惯例:
- 只保留总和增长率最高的项:
O(n^2+n)=O(n^2)
- 去掉产品的常数:
O(n^2/4)=O(n^2)
O(n^4+n^3+n^2+n)
明显比O(n^4)
更糟糕
在这种情况下,任何依赖于输入参数的项都应该包括在内。事实上,即使是常量项也可能有用。例如,将O(n+1e100)
与O(n^2)
进行比较,后者将在相当长的一段时间内优于前者,直到n
变得足够大,足以对常量项产生影响
(a) 当然,有人会说,不应该以这种方式使用它,但实用主义在现实世界中常常克服教条主义:-)从中可以看出,像1/4这样的常数在确定大O符号方面不起作用。唯一有趣的事实是它是n^3,因此是O(n^3)。一个小的技术性问题。大O表示法旨在根据输入的“大小”而不是数值来描述复杂性。如果您的输入是一个数字,那么输入的大小就是您的数字的位数。唉,您的算法是O(2^N^3),N是位数
从形式上讲,时间复杂度可以推导如下:
智能编译器可能会将此循环嵌套优化为O(1),因为它实际上什么都不做。“智能”编译器会将其置之一旁,除非另有说明-它可能是嵌入式系统中的一个计时循环,通过透析机控制血流量:-)有更好的方式实现计时(几乎用任何语言)而不是创建没有定义执行时间的无意义循环!此外,n^3+n将
+n
作为一个可以删除的低阶项包含在内。谢谢,@Anthony,我刚刚收集了一些示例,我应该在发布之前仔细阅读它们。只有当您的姓不是“Knuth”时,这才是正确的这真的没有什么意义,只是没有遵循简化的惯例。你把我丢在这里了,@token。这个循环中的“大小”显然是数值,而不是位数(这需要在n的某个地方有一个logbase-10)。
O(n^3 / log(n))
O(n^3 * 10^n)