📜  使用动态规划的阿克曼函数

📅  最后修改于: 2021-09-22 10:39:02             🧑  作者: Mango

给定两个非零整数MN ,问题是基于某些特定方程计算阿克曼函数的结果。

例子:

本文中描述的阿克曼函数的方法,即使是 (M, N) 的小值也需要大量时间来计算值,或者在大多数情况下不会产生任何结果。

动态规划方法:

以下是用于提出有效解决方案的以下阿克曼方程。

让我们假设 m = 2和 n = 2 的值

创建大小为 ( (m+1) x (n+1) ) 的 2d DP 表,用于存储每个子问题的结果。

以下是填充表格的步骤。

  1. 空表 – 初始步骤
  2. 使用 A ( 0, n ) = n + 1 填充
    下一个方法是借助等式 2填充所有基值。

  3. 在下一步中,整个第一行将被填充,

  4. 使用方程和存储值填充表格

    让我们以与上述相同的方式填充最后一行的第一列,即 (2, 0) ,因为对于其他两列,有一些未解决的值。

  5. 求解A ( 2, 1 )A ( 2, 2 )。

    为简单起见,求解上述函数的过程分为两个步骤,

    • 在第一个中,确定了问题。

    • 下一篇详细介绍了方法论,得到了一个通用公式,在程序中使用时是合乎逻辑的。

      让我们先用理论求解A ( 2, 2 )

      要以通用方式计算A(1, 5) ,请观察它如何减少自身!

    要点:

  6. 每个子问题的结果的最终表

下面是上述方法的实现:

Python3
# Python code for the above approach
  
# Bottum Up Approach
def Ackermann(m, n):
  
    # creating 2D LIST
    cache = [[0 for i in range(n + 1)] for j in range(m + 1)]
    for rows in range(m + 1):
        for cols in range(n + 1):
            # base case A ( 0, n ) = n + 1
            if rows == 0:       
                cache[rows][cols] = cols + 1
            # base case  A ( m, 0 ) = 
            # A ( m-1, 1) [Computed already]
            elif cols == 0:
                cache[rows][cols] = cache[rows-1][1]
            else:
                # if rows and cols > 0
                # then applying A ( m, n ) = 
                # A ( m-1, A ( m, n-1 ) ) 
                r = rows - 1
                c = cache[rows][cols-1]
                # applying equation (2) 
                # here A ( 0, n ) = n + 1
                if r == 0:    
                    ans = c + 1
                elif c <= n:
                    # using stored value in cache
                    ans = cache[rows-1][cache[rows][cols-1]]
                else:
                    # Using the Derived Formula 
                    # to compute mystery values in O(1) time
                    ans = (c-n)*(r) + cache[r][n]
  
                cache[rows][cols] = ans
  
    return cache[m][n]
  
# very small values
m = 2     
n = 2
  
# a bit higher value
m1 = 5      
n1 = 7
  
  
print("Ackermann value for m = ", m,
      " and n = ", n, "is -> ", 
      Ackermann(m, n))
  
print("Ackermann value for m = ", m1, 
      " and n = ", n1, "is -> ", 
      Ackermann(m1, n1))


输出:

时间复杂度: O( M * N )
辅助空间复杂度: O( M * N )

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程