【问题标题】:Time Complexity of ackermann function阿克曼函数的时间复杂度
【发布时间】:2016-11-18 21:55:16
【问题描述】:

有人知道以大 O 表示法计算阿克曼函数 ack(m,n) 的时间复杂度或它属于哪个复杂度类吗? 只需 Ack(3, n) 也足够了。 我在某处读到它是 NONELEMENTARY?

谢谢。

代码片段:

public class Ackermann {

    public static int ackermann(int n, int m) {

        if (n == 0)
            return m + 1;
        else if (m == 0)
            return ackermann(n - 1, 1);
        else
            return ackermann(n - 1, ackermann(n, m - 1));
    }

}

【问题讨论】:

  • 使用您的代码对ack(3, n) 进行的递归调用的数量是指数级的——您可以从oeis.org/A074877 计算出它的确切调用次数

标签: complexity-theory time-complexity ackermann


【解决方案1】:

最坏情况计算时间的渐近极限,表示为输入长度或时间复杂度的函数:不能为 mu 递归函数定义,至少在不参考与典型的大 oh 符号非常不同的另一个 mu 递归函数的情况下不能定义。这仅适用于像我们的主题一样“完全”的 mu 递归函数。

【讨论】:

  • Ackermann 函数不能通过 for next 循环进行编程,循环限制是参数的任何原始递归函数。您将不得不坚持使用 while 循环,而不知道迭代次数。
【解决方案2】:

这个函数我不太了解,但是快速看了一下,好像是伪多项式。也就是说,运行时间取决于它的输入,并且在某些输入上可以是多项式时间,而在其他输入上可以是非多项式时间。这可以使用康托尔对角化来证明

【讨论】:

  • 好的。那么它的名字是什么?复杂度是 class= 伪多项式吗?
  • 我会说那是复杂性类。也看@arstechnica.com/civis/viewtopic.php?f=20&t=865597
  • 听起来不错。尽管如此,我已经阅读了一些关于 ELEMENTARY en.wikipedia.org/wiki/ELEMENTARY 的内容,我认为它的补充(N​​ONELEMENTARY)也可以描述这个函数的特性。你说这是对的吗?
  • 老实说,我不确定,但我会说这是合理的。希望其他人可以澄清一下。
  • 好的,谢谢。在那之前,我决定将它简单地归类为非简单递归,就像它的目的一样。
【解决方案3】:

如果您只对 Ack(3,n) 感兴趣,那就是 O(exponentiation)。 Ack(3,n) = 2n+3-3。这可以通过 O(logn) 运算来计算。

【讨论】:

  • 没错,但我用它作为基准,所以我从 Péter 那里拿了 Standardform。我添加了一个代码示例。
【解决方案4】:

这主要是第三种情况,涉及大量复杂性......它的形式为 (((2^2)^2)^2)^2 等等......所以,通过检查你可以看到复杂度是 2^(2^n) ...这种复杂度比 n^n 差得多,所以我在其他地方读到阿克曼函数就像原始递归函数的上限,但我不完全确定...需要做更多的研究...

【讨论】:

    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 2012-01-31
    • 2015-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多