【发布时间】:2010-11-28 07:12:33
【问题描述】:
在我们大学的离散数学课程中,老师给他的学生看Ackermann function,并让学生在纸上开发函数。
除了作为递归优化的基准之外,阿克曼函数还有实际用途吗?
【问题讨论】:
标签: algorithm math complexity-theory discrete-mathematics
在我们大学的离散数学课程中,老师给他的学生看Ackermann function,并让学生在纸上开发函数。
除了作为递归优化的基准之外,阿克曼函数还有实际用途吗?
【问题讨论】:
标签: algorithm math complexity-theory discrete-mathematics
阿克曼函数最初的“用途”是为了表明有些函数不是原始递归的,即不能通过仅使用具有预定上限的 for 循环来计算。
阿克曼函数就是这样一个函数,它增长太快而无法进行原始递归。
我不认为有真正的实际用途,它增长太快而无用。您甚至无法在合理的空间内明确表示超出 a(4,3) 的数字。
【讨论】:
我同意“理论上”的另一个答案(通过 wrang-wrang)。
在实践中,Ackerman 并不太有用,因为在实践中,您往往会遇到的唯一算法复杂性涉及 1、N、N^2、N^3 以及每一个都乘以 logN。 (而且由于 logN 永远不会超过 64,因此它实际上是一个常数项。)
重点是,“在实践中”,除非您的算法复杂度“太大 N 倍”,否则您不必关心复杂度,因为现实世界的因素将占主导地位。 (理论上,在 O(inverse-Ackermann) 时间内执行的函数比在 O(logN) 时间内执行的函数要好,但在实践中,您将根据实际数据测量两个实际实现,然后选择实际性能更好的函数. 相比之下,复杂性理论确实“在实践中很重要”,例如 N 与 N^2,其中算法复杂性效应实际上压倒了任何“现实世界”效应。我发现“N”是在实践中重要的最小度量.)
【讨论】:
是的。 (逆)阿克曼函数出现在算法的复杂性分析中。当它出现时,这意味着您几乎可以忽略该术语,因为它增长如此缓慢(很像 log(log ... log(n)...)),即 lg*(n)。例如:Minimum Spanning Trees(也称为here)和Disjoint Set森林建设。
【讨论】: