Algorithm 在记忆化的情况下,复杂性如何从O(2^n)降低到O(n^2)?

Algorithm 在记忆化的情况下,复杂性如何从O(2^n)降低到O(n^2)?,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我目前正在通过记忆和制表技术学习动态规划。关于下面的链接(最长递增序列问题),我不明白当我们记忆时,复杂性是如何从O(2^n)降低到O(n^2)的 在记忆一个函数时,每次调用该函数时都要记下a)参数和b)结果。然后,当您下次要再次调用该函数时,请在备注中检查您以前是否使用这次要使用的参数调用过该函数。如果有,则不需要再次调用该函数,因为已经有了结果。通过这种方式,函数的调用次数仅与具有不同参数的次数相同:如果要使用已经使用的参数调用函数,则无需调用它 如果a)函数是确定性的,即每次使用相同的参数

我目前正在通过记忆和制表技术学习动态规划。关于下面的链接(最长递增序列问题),我不明白当我们记忆时,复杂性是如何从O(2^n)降低到O(n^2)的


在记忆一个函数时,每次调用该函数时都要记下a)参数和b)结果。然后,当您下次要再次调用该函数时,请在备注中检查您以前是否使用这次要使用的参数调用过该函数。如果有,则不需要再次调用该函数,因为已经有了结果。通过这种方式,函数的调用次数仅与具有不同参数的次数相同:如果要使用已经使用的参数调用函数,则无需调用它

如果a)函数是确定性的,即每次使用相同的参数调用函数时返回相同的值,以及b)与记忆成本相比,函数的成本较高,则此方法效果良好

你举的例子是这样的:

在前面的方法中,许多递归调用必须使用相同的参数一次又一次地进行。这种冗余可以通过将特定调用的结果存储在二维存储阵列中来消除

这里讨论的函数称为O(2n)次,但只有O(n2)组不同的参数。使用记忆,只对每个不同的参数集(O(n2))调用一次函数,而不是每次算法需要答案(O(2n))时调用一次函数


我猜答案只在您在问题中提供的链接中给出! 我将引用其中的原话:

“对于二维记忆数组memomo中的特定调用。memo[i][j]memo[i][j]表示LIS的长度,使用nums[i]nums[i]作为LIS中考虑包含/不包含的前一个元素,使用nums[j]nums[j]作为LIS中考虑包含/不包含的当前元素。”

我假设您已经理解了递归的第一个解决方案,然后转向这个解决方案,所以现在您已经理解了我们在第一个解决方案中尝试做什么的基本概念:我们正在检查是否通过包含或排除数组的当前元素来获得最大值。这就是为什么我们每次调用2次,一次调用将当前元素作为prev,另一次调用将prev保持原样(当然,我们也适当地调用了函数的其他参数!)。由于这种方法,它需要O(2^n)

>如果我的PREV=N-2和CUR= N-1,那么在LIS计数中,我可以排除N-1或考虑N-1。我们的函数调用如下所示:



很明显,我们将不必要地使用prev=n和cur=n+1调用函数两次,所有子代调用也将调用两次!因此,这里的关键思想是直接使用记忆的答案,从而消除所有子函数调用

另一个数组为[1,2,3,4]的示例



在这里,2,3调用被执行两次,由于数组的大小很小,这个示例不是很有效,但我希望您能理解我的观点,即在消除后续函数调用的同时,我们正在以指数方式降低复杂性


那么会有多少个电话?我们大致可以这样想:每个元素在上一个参数和当前参数下都可能存在,所以可能存在大约O(n^2)的可能性,我们对它们进行了过度计数

通过对较小的子问题重复使用解决方案,而不是重复多次工作。@ruakh一开始我也这么认为,但这句话很有道理——复杂性从O(2^n)降低到O(n^2)。@FrankSchmitt:OMG,你说得很对。谢谢
                                prev=n-2,cur=n-1
            prev=n-1, cur=n                        prev=n-2, cur = n
prev=n-1, cur=n+1        prev=n, cur=n+1     prev=n-2,cur=n+1     prev=n,cur=n+1
                                        min_int, 1

                min_int, 2                                  1, 2

    min_int,3                   2, 3                1, 3            2, 3 

 min_int, 4  3, 4       2, 4    3, 4          1, 4     3, 4    2, 4    3, 4