有人知道用big-O表示法计算ackermann函数ack(m,n)的时间复杂度或者它属于哪个复杂类? Just Ack(3,n)也足够了。 我在某处看到它是无关紧要的?
感谢。
代码段:
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));
}
}
答案 0 :(得分:2)
最坏情况计算时间的渐近极限表示为输入长度或时间复杂度的函数:不能定义mu递归函数,而不能指定另一个mu递归函数,与典型的大符号非常不同。这只适用于像我们的主题一样“完全”的mu递归函数。
答案 1 :(得分:1)
我不太了解这个函数,但很快就看到它,它似乎是伪多项式。也就是说,运行时取决于它的输入,并且在某些输入上可以是多项式时间,而在其他输入上可以是非多项式。这可以使用康托尔的对角化
来证明答案 2 :(得分:1)
如果您对Ack(3,n)感兴趣,那么它就是O(取幂)。 Ack(3,n)= 2 n + 3 -3。这可以使用O(logn)操作计算。
答案 3 :(得分:1)
它主要是涉及大量复杂性的第三种情况......它的形式为(((2 ^ 2)^ 2)^ 2)^ 2等等......所以,通过检查你可以看到复杂度是2 ^(2 ^ n)......这种复杂性比n ^ n差得多,所以我在其他地方读到ackermann的函数就像原始递归函数的上界一样但是我不完全确定......需要做更多研究......