繁体   English   中英

使用有限for循环的程序的最大效率是多少?

[英]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)?

这完全取决于for循环中的内容。 另外,计算复杂度通常是根据输入的大小n衡量的在您的示例中,我看不到任何模型可以直接或间接地对输入的大小进行建模,表示或编码。 只有常数10

此外,尽管有时对计算复杂度的分析可能会给出意想不到的令人惊讶的结果,但正确的术语不是Big Oh ”,而是Big-O

您只能谈论有关计算的某些特定输入的复杂性。 如果您要进行十次循环是因为需要处理十个“事物”,那么相对于这些事物,您的复杂度为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
  • 等等..

同样,在您的示例中,没有提到输入数量,并且循环迭代是固定的。 即使有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM