使用有限循环的程序的大功效是多少?

时间:2013-05-17 10:23:31

标签: c++ performance algorithm

以下程序的效率是多少,它是一个for循环,它运行的是有限的no。时间。

for(int i = 0; i < 10; i++ )
{
   //do something here, no more loops though.
}

那么,效率应该是多少。 OF(1)或O(n)?

4 个答案:

答案 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(N)表示时间是c + xN,其中c是固定开销,x是每单位处理时间,
  • O(log 2 N)表示时间为c + x(log 2 N),
  • O(N 2 )表示时间为c + x(N 2 ),
  • O(N!)表示时间是c + x(N!)
  • O(N N )表示时间为c + x(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)

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);
    }
}