【问题标题】:Uses of Ackermann function?阿克曼函数的用途?
【发布时间】:2010-11-28 07:12:33
【问题描述】:

在我们大学的离散数学课程中,老师给他的学生看Ackermann function,并让学生在纸上开发函数。

除了作为递归优化的基准之外,阿克曼函数还有实际用途吗?

【问题讨论】:

标签: algorithm math complexity-theory discrete-mathematics


【解决方案1】:

阿克曼函数最初的“用途”是为了表明有些函数不是原始递归的,即不能通过仅使用具有预定上限的 for 循环来计算。

阿克曼函数就是这样一个函数,它增长太快而无法进行原始递归。

我不认为有真正的实际用途,它增长太快而无用。您甚至无法在合理的空间内明确表示超出 a(4,3) 的数字。

【讨论】:

    【解决方案2】:

    我同意“理论上”的另一个答案(通过 wrang-wrang)。

    在实践中,Ackerman 并不太有用,因为在实践中,您往往会遇到的唯一算法复杂性涉及 1、N、N^2、N^3 以及每一个都乘以 logN。 (而且由于 logN 永远不会超过 64,因此它实际上是一个常数项。)

    重点是,“在实践中”,除非您的算法复杂度“太大 N 倍”,否则您不必关心复杂度,因为现实世界的因素将占主导地位。 (理论上,在 O(inverse-Ackermann) 时间内执行的函数比在 O(logN) 时间内执行的函数要好,但在实践中,您将根据实际数据测量两个实际实现,然后选择实际性能更好的函数. 相比之下,复杂性理论确实“在实践中很重要”,例如 N 与 N^2,其中算法复杂性效应实际上压倒了任何“现实世界”效应。我发现“N”是在实践中重要的最小度量.)

    【讨论】:

    • 确实,理论分析只是给你做性能分析的基础。
    • 你能解释一下 logN 是怎么不超过 64 的吗?
    • 通常“log”是以 2 为基数的。如果 log(n) 为 64,则意味着您有 2^64 项数据。这远远超过你在实践中所拥有的;实际上,在 64 位计算机上,您有 64 位指针,因此您甚至无法轻松表示超过 2^64 个字节。
    • @Andrey 您的解释应该添加到这个答案中。在更高位的架构中,它在某种程度上仍然很重要。区别在于 GPU 上的着色器之类的东西,每一秒都很重要。
    【解决方案3】:

    是的。 (逆)阿克曼函数出现在算法的复杂性分析中。当它出现时,这意味着您几乎可以忽略该术语,因为它增长如此缓慢(很像 log(log ... log(n)...)),即 lg*(n)。例如:Minimum Spanning Trees(也称为here)和Disjoint Set森林建设。

    还有:Davenport-Scinzel sequences

    【讨论】:

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