【问题标题】:How can I optimize Ackermann Function?如何优化阿克曼函数?
【发布时间】:2022-01-01 04:23:16
【问题描述】:

我需要找到阿克曼函数的优化并解释阿克曼问题本身的问题。但是,我不确定我应该从哪里开始。我知道阿克曼函数的增长速度比任何原始递归函数都快。也许使用 BigInteger 存储结果会有所帮助?或者也许使用记忆?

例如,如果我们知道 A(0,1) = 1+1, A(1,0) = A(0,1), A (1,1) = A(0,A(1,0)) 我可以根据“n”从那里构建。
这听起来合理还是无法实现?是什么实际问题导致它即使对于少量数字也能如此快速地增长?

class Ackermann
{
 
    static int ack(int m, int n)
    {
        if (m == 0)
        {
            return n + 1;
        }
        else if((m > 0) && (n == 0))
        {
            return ack(m - 1, 1);
        }
        else if((m > 0) && (n > 0))
        {
            return ack(m - 1, ack(m, n - 1));
        }else
        return n + 1;
    }

    public static void main(String args[])
    {
        System.out.println(ack(1, 2));
    }
}

【问题讨论】:

  • 只有小的 m 才能给出足够小的结果而不会溢出 int,并且您可以对这些值的计算进行硬编码(有关该函数的信息,请参见维基百科页面上的“值表”)。即使使用 bignums,也无法到达 Ackerman(5, 0) 或 Ackerman(4, 3)。

标签: algorithm optimization ackermann


【解决方案1】:

来自this post,您可以找到以下内容:

只有通过不一遍又一遍地重新计算子结果才能实现真正的执行时间增益。 记忆化是一种优化技术,其中函数调用的结果被缓存并在再次出现相同的输入时返回。参见例如 Ward (1993)。 Grossman & Zeitman (1988) 发表了一个巧妙的算法,它在O(i x A(i,n)) 时间和O(i) 空间内计算A(i, n)

【讨论】:

  • 在那张纸上找到了好东西!这是一本很棒的书。
猜你喜欢
  • 1970-01-01
  • 2010-11-28
  • 2012-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多