有限 For 循环程序的 Big Oh 效率是多少?
Posted
技术标签:
【中文标题】有限 For 循环程序的 Big Oh 效率是多少?【英文标题】:What is the Big Oh Efficiency of Program with Finite For Loop? 【发布时间】:2013-05-17 10:23:31 【问题描述】:以下程序的效率是多少,它是一个 for 循环,运行有限的编号。次。
for(int i = 0; i < 10; i++ )
//do something here, no more loops though.
那么,效率应该是多少。 O(1) 还是 O(n) ?
【问题讨论】:
答案取决于循环体的复杂程度。O(1)
如果10
是与n
无关的常量,否则O(n)
O(1),因为算法中没有 N。
for(int i = 0; i < 10; i++ ) i = 0;
这是一个很大的哦,不!
请注意,O()
通常不会以非常正式的方式使用。例如 - 计算机具有有限的内存 - 有限数量的状态,因此终止的每个计算都以O(1)
终止。或者,循环 for(int i = 0; i < n; i++ )
最多执行 INT_MAX = O(1)
步骤。
【参考方案1】:
这完全取决于for
循环中的内容。此外,计算复杂度通常根据输入的大小n
来衡量,我在您的示例中看不到任何直接或间接建模或表示或编码输入大小的内容.只有常量10
。
此外,虽然有时对计算复杂性的分析可能会给出意想不到的、令人惊讶的结果,但正确的术语不是“Big Oh”,而是@ 987654322@.
【讨论】:
【参考方案2】:您只能谈论与计算的某些特定输入相关的复杂性。如果你循环十次,因为你需要为十个“东西”工作,那么你的复杂性是 O(N) 相对于这些东西。如果您只需要循环 10 次而不考虑事物的数量 - 并且循环内部的处理时间不会随着事物的数量而变化 - 那么您对它们的复杂性是 O(1 )。如果没有“某物”的阶数大于 1,那么将循环描述为 O(1) 是公平的。
有点进一步的漫无边际的讨论......
O(N) 表示完成工作所花费的时间可以合理地近似为某个恒定的时间量加上 N 的某个函数 - 输入中某些东西的数量 - 对于 N 的巨大值:
O(N) 表示时间为 c + xN,其中 c 是固定开销,x 是每个事物的处理时间, O(log2N)表示时间为c + x(log2N), O(N2)表示时间为c + x(N2), O(N!) 表示时间为 c + x(N!) O(NN)表示时间为c + x(NN) 等等..同样,在您的示例中,没有提及输入数量,并且循环迭代是固定的。我可以看到说它是 O(1) 即使 有 10 个输入“某些东西”是多么诱人,但请考虑:如果你有一个能够处理任意数量输入的函数,然后决定你'只会在你的应用程序中使用它,只有 10 个输入和硬代码,你显然没有改变函数的性能特征——你只是锁定在 time-for-N-input 曲线上的一个点- 并且在硬编码之前有效的任何 big-O 复杂性在之后必须仍然有效。尽管 N of 10 是一个小数目,但它的意义和用处不大在描述整体性能时,它们比 N 的巨大值(其中大 O 表示法的变化通常比改变 c 甚至 x 对性能的影响要大得多——这当然是进行大 O 分析的重点) .
【讨论】:
【参考方案3】:当然是 O(1),因为这里没有什么不与 n 线性相关。
编辑: 让循环体包含一些复杂的动作,用大 O 术语表示复杂度为 O(P(n))。
如果我们有恒定的 C 次迭代,那么循环的复杂度将为 O(C * P(n)) = O(P(n))。
否则,现在让迭代次数为 Q(n),取决于 n。它使得循环的复杂度为 O(Q(n) * P(n))。
我只是想说,在迭代次数不变的情况下,不会改变整个循环的复杂度。
【讨论】:
我不同意,例如可以是O(n)
,具体取决于for
循环中的内容。
谢谢,亚当。很好的补充。但我真的认为提问者在循环中想到了一些简单的、恒定时间的动作。现在我想我可以澄清我的答案了。【参考方案4】:
Big O notation 中的n
表示输入大小。我们无法判断复杂性是什么,因为我们不知道for
循环内部发生了什么。例如,可能存在递归调用,具体取决于输入大小?在这个例子中,整体是O(n)
:
void f(int n) // input size = n
for (int i = 0; i < 10; i++ )
//do something here, no more loops though.
g(n); // O(n)
void g(int n)
if (n > 0)
g(n - 1);
【讨论】:
以上是关于有限 For 循环程序的 Big Oh 效率是多少?的主要内容,如果未能解决你的问题,请参考以下文章
Big -oh 的定义中的 No 是不是应该是两条曲线的交点?