[英]What is the Big Oh Efficiency of Program with Finite For Loop?
以下程序的效率是多少,它是一个for循环,以有限的编号运行。 的时间。
for(int i = 0; i < 10; i++ )
{
//do something here, no more loops though.
}
因此,功效应该是什么。 O(1)或O(n)?
您只能谈论有关计算的某些特定输入的复杂性。 如果您要进行十次循环是因为需要处理十个“事物”,那么相对于这些事物,您的复杂度为O(N)。 如果您只需要循环10次而不考虑事物的数量-并且循环内的处理时间不会随事物的数量而变化-那么关于它们的复杂度为O(1)。 如果不存在阶数大于1的“事物”,那么将循环描述为O(1)是公平的。
O(N)表示完成工作所需的时间可以合理地近似为某个恒定的时间量加上N的某些函数-输入中某物的数量-对于N的巨大值:
同样,在您的示例中,没有提到输入数量,并且循环迭代是固定的。 即使有10个输入“东西”,我也能说出O(1)很诱人,但是请考虑:如果您有一个能够处理任意数量的输入的函数,那么决定只在您的输入中使用它具有10个输入和硬编码的应用程序,您显然没有改变函数的性能特征-您仅锁定了N次输入曲线上的单个点-以及任何big-O复杂性在硬编码之前有效,此后必须仍然有效。 尽管N的个位数很小,但它的意义和实用性却不大,因为N的个数很少,除非10像O(N N )这样令人讨厌的大O复杂度,否则常数c和x在描述整体性能方面比它们具有更重要的意义对于N的巨大值(大O符号的更改通常对性能的影响要比更改c甚至x的影响大得多-这当然是进行大O分析的重点)。
确定O(1),因为这里没有任何东西与n线性不相关。
编辑:让循环体包含一些复杂的动作,用大O项表示复杂度为O(P(n))。
如果我们有一个恒定的C迭代次数,则循环的复杂度将为O(C * P(n))= O(P(n))。
否则,现在让迭代次数为Q(n),取决于n。 这使得循环O(Q(n)* P(n))变得很复杂。
我只是想说,当迭代次数恒定时,它不会改变整个循环的复杂性。
Big O表示法中的 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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.