以下程序的效率是多少,它是一个for循环,它运行的是有限的no。时间。
for(int i = 0; i < 10; i++ )
{
//do something here, no more loops though.
}
那么,效率应该是多少。 OF(1)或O(n)?
答案 0 :(得分:9)
这完全取决于for
循环中的内容。此外,计算复杂度通常根据输入<{strong>>的大小n
进行测量,我在示例中看不到任何直接或间接模拟或表示或编码大小的输入。只有常数10
。
此外,虽然有时对计算复杂性的分析可能会产生意想不到的,令人惊讶的结果,但正确的术语是不“ Big Oh ”,而是 Big-O 强>
答案 1 :(得分:4)
您只能谈论计算的某些特定输入的复杂性。如果你循环十次,因为你需要做十个“事情”,那么你的复杂性就是那些事情的O(N)。如果你只需要循环10次而不管多少东西 - 并且里面的处理时间循环不会随着某些东西的数量而改变 - 那么你对它们的复杂性就是O(1 )。如果订单大于1没有“某事”,那么将循环描述为O(1)是公平的。
进一步漫无边际的讨论...
O(N)表示完成工作所需的时间可以合理地近似一些恒定的时间加上N的一些函数 - 输入中的某些东西的数量 - 对于N的巨大值:
同样,在您的示例中,没有提及输入的数量,并且循环迭代是固定的。我可以看出它是多么诱人的说O(1)即使有10个输入“东西”,但是考虑一下:如果你有一个能够处理任意数量的输入的函数,那么决定你只会在您的应用程序中使用它,只有10个输入和硬编码,您显然没有改变功能的性能特征 - 您只是锁定在N次输入曲线的时间点上的单个点 - 在硬编码之前有效的任何大O复杂性必须在之后仍然有效。它的意义和用处都不那么有用,因为10的N是一个很小的数量,除非你有像O(N N )这样可怕的大O复杂性,常数c和x更重要在描述总体性能时,它们对于大的N值(其中大O符号的变化通常对性能的影响远大于改变c或甚至x - 这当然是进行大O分析的重点)
答案 2 :(得分:2)
当然是O(1),因为这里没有任何东西不依赖于n。
修改强> 让循环体包含一些复杂的动作,复杂的O(P(n))在Big O术语中。
如果我们有一个恒定的C迭代次数,循环的复杂性将是O(C * P(n))= O(P(n))。
否则,现在让迭代次数为Q(n),取决于n。它使得循环O(Q(n)* P(n))的复杂性。
我只是想说,当迭代次数不变时,它不会改变整个循环的复杂性。
答案 3 :(得分:1)
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);
}
}