在我大学的离散数学课程中,老师向学生展示Ackermann function,并指派学生在纸上发展这项功能。
除了作为递归优化的基准之外,Ackermann函数是否有任何实际用途?
答案 0 :(得分:15)
是。 (逆)Ackermann函数出现在算法的复杂性分析中。当它发生时,它意味着你几乎可以忽略该术语,因为它变得如此缓慢(很像log(log ... log(n)......)),即lg *(n)。例如:Minimum Spanning Trees(也here)和Disjoint Set森林构建。
答案 1 :(得分:10)
Ackermann函数的原始“使用”是为了表明存在非原始递归的函数,即不能仅通过使用具有预定上限的循环来计算。
Ackermann函数就是这样一个函数,它变得太快而不能原始递归。
我认为没有真正的实际用途,它变得太快而无法发挥作用。您甚至无法在合理的空间内明确表示超出(4,3)的数字。
答案 2 :(得分:3)
我同意另一个答案(通过争吵)“在理论上”。
在实践中,Ackerman并不太有用,因为在实践中,您倾向于遇到的唯一算法复杂性涉及1,N,N ^ 2,N ^ 3,以及每个乘以logN的算法。 (并且因为logN永远不会超过64,所以无论如何它实际上都是一个常数。)
关键是,“在实践中”,除非你的算法复杂度是“N倍太大”,否则你不关心复杂性,因为现实世界因素将占主导地位。 (在O(逆Ackermann)中执行的函数在理论上比在O(logN)时间内执行的函数更好,但在实践中,您将根据实际数据测量两个实际实现并选择实际上更好的执行相比之下,复杂性理论确实“在实践中具有重要意义”,例如N与N ^ 2,其中算法复杂性效应确实会影响任何“现实世界”效应。我发现“N”是实践中最重要的最小衡量标准。 。)