【问题标题】:Computing Time T(n) and Big-O with an infinite loop使用无限循环计算时间 T(n) 和 Big-O
【发布时间】:2011-12-05 17:05:33
【问题描述】:

我对如何创建函数 T(n) 来测量嵌套无限循环的计算时间感到困惑。代码如下:

x=1;
for(int i = 0;i<n-1;i++){
     for(int j = 1; j<=x; j++){
        cout << j << endl;
        x*=2;
     }
}

所以内部循环将永远持续下去,我被困在尝试创建函数来表示其计算时间。我已经写过它的计算时间是 T(n) = [Summation i=0 until (n-2)] (2^j)。 2^j 表示 x 的值与来自内部循环的 j 的当前值。在与同行讨论后,我们绝对同意计算时间肯定不取决于 n 的值。我们也可能完全过度思考这一点,因为循环是无限的,根本没有办法表达它的计算时间。非常感谢任何帮助。

【问题讨论】:

  • 我完全糊涂了。您想要无限循环的运行时间吗?它是无限的。顺便说一句,外循环是无关紧要的,因为内循环永远不会完成。此外,在实践中它可能不是无限的,因为如果 x 是整数类型,它最终会换行。
  • 时间复杂度只对终止的算法有意义。
  • 是的,我知道外循环是无关紧要的,是的,我知道为这样的事情设计计算算法没有意义,但我需要尝试 :)

标签: big-o infinite-loop


【解决方案1】:

算法复杂度仅针对算法定义,根据(最常接受的)定义必须终止。这个过程不会终止(除了 Marcelo 指出的“在实践中”;即作为真实机器上的程序与理论上具有无限磁带的理论图灵机上的程序以及世界上所有时间)所以不是算法.所以它没有“算法时间复杂度”。

试图确定非算法的算法复杂度是徒劳的,如果它是一个无限过程,试图将其运行时间表示为多项式也是徒劳的。

【讨论】:

    【解决方案2】:

    真正无限循环的 Big-O 复杂度是未定义。原因如下:

    Big O 表示法的定义是这样的:

    f(N) = O(g(N)) 当且仅当f(n) &lt;= |M g(n)| 用于某些常量M 和所有n &gt;= n0

    但是,前提是f(n)g(n) 是实值函数。

    在无限循环的情况下,完成循环所用时间的假设值是无限的。因此函数f(n) 不会将N 映射到实数。因此,f(N) 不是实值函数,我们不能以数学意义上的方式应用标准 Big O 定义。

    Big O Notation 上的维基百科页面更正式地说明了定义,但结果是一样的。)


    我们还认为,根据通用定义,不能在有限步内完成的算法严格来说不是算法。 (例如,请参阅 Wikipedia description of an algorithm。)由于无限循环没有完成......永远......它不是算法,也不能具有算法复杂性。

    (但是,我不喜欢这种解释,因为它依赖于术语“算法”的特定定义。问题实际上并未使用该术语。)

    【讨论】:

      【解决方案3】:

      嗯,在现实世界中,由于显而易见的原因,你不会得到答案,但在数学中......为什么不呢。

      我会写下函数的时间方程:

      T(n) = n-1 * T(X) 
      

      T(X) 是内循环的时间。我会花掉它:X1 = x 的初始值(在本例中为 1

      T(X) = T(X1 * 2) + 1 = T(X1 * 4) + 2 = ... = T(X1 * 2^j) + j
      

      这个循环的结束条件是当j &gt;= X1 * 2^j + 1,所以我们要解决:

      j >= X1 * 2^j -> j = 2^j -> j <= log2(j).
      

      上面的方程在这个自然数集合范围内没有解,但在整数集合中,它很容易用-1 求解(实际上是任何小于0 的整数)。

      因此,T(n) 的时间复杂度将是 (n-1) * (-1) = 1 - n

      我不知道这有什么用,但我希望它能帮到你。

      【讨论】:

      • 天哪!对数一般为小于或等于0的任何参数定义。
      • Log 没有定义在 0 下,但是在我看来,你也无法定义无限循环的时间复杂度。
      • 好吧,那么你应该写那个而不是写一个数学上错误的答案!这尤其与您的第一段相矛盾:但在数学中......为什么不呢。更好的答案是T(n) = +inf,因为它肯定不会引起 OP 的困惑。
      • 我不同意。 OP提出了一个明显不规则的问题。所以,我认为不规则的方法会有益于这个问题。这就像 n
      • 我不反对扩展数学。但是在数学中,您添加到其中的所有内容都必须与已经存在的所有内容一致(正确)。您的定义不符合这一点,因为它会导致矛盾 - 考虑到2^xR 中严格增加,我们得到0.5 = 2^-1 &lt;= 2^log_2(-1) = -1。因此,这不是(有效的)数学证明。除此之外,时间复杂度永远不会是&lt; 0,这与您的结果相矛盾。此外,我们有不变量:时间复杂度 总是 &gt;= 空间复杂度(Theta(1) 此处),这对于您的结果同样不正确。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-25
      • 2015-07-28
      相关资源
      最近更新 更多