证明动态规划中的记忆化并不总是有帮助的反例
Counter-examples to prove that memoization in dynamic programming is not always helpful
这是我上个月 class 测试的一部分,从那时起我花了一些时间阅读 DP 中的记忆化及其对后者的影响。我能够找到并彻底理解它被证明是富有成果的案例,但是由于 DP 从根本上将这种方法用于 "store" 子问题为了以后使用,从某种意义上说,这不会使问题有点错误,因为总会有某种当前解决方案的缓存以供将来使用吗?
如有错误请指正
没有!记忆并非在所有情况下都有帮助。人们可以想到的一个简单的反例是 factorial(n)
函数,您需要在其中计算给定数字 n
的阶乘。
factorial(n):
if(n = 1) return;
else return n*factorial(n-1);
考虑上面的伪代码来计算给定数字 n
的阶乘。比如,n = 5,该函数将计算 factorial(5)
,如下所示:
- 5*
factorial(4)
- 4*
factorial(3)
- 3*
factorial(2)
- 2*
factorial(1)
- 1*
factorial(0)
- 1
如您所见,每次从函数返回一个新值并且每次存储该值都没有意义,因为后续的递归调用将无法受益来自它。
在这种情况下,我们采用另一种方法,我们称之为制表。
这是我上个月 class 测试的一部分,从那时起我花了一些时间阅读 DP 中的记忆化及其对后者的影响。我能够找到并彻底理解它被证明是富有成果的案例,但是由于 DP 从根本上将这种方法用于 "store" 子问题为了以后使用,从某种意义上说,这不会使问题有点错误,因为总会有某种当前解决方案的缓存以供将来使用吗?
如有错误请指正
没有!记忆并非在所有情况下都有帮助。人们可以想到的一个简单的反例是 factorial(n)
函数,您需要在其中计算给定数字 n
的阶乘。
factorial(n):
if(n = 1) return;
else return n*factorial(n-1);
考虑上面的伪代码来计算给定数字 n
的阶乘。比如,n = 5,该函数将计算 factorial(5)
,如下所示:
- 5*
factorial(4)
- 4*
factorial(3)
- 3*
factorial(2)
- 2*
factorial(1)
- 1*
factorial(0)
- 1
如您所见,每次从函数返回一个新值并且每次存储该值都没有意义,因为后续的递归调用将无法受益来自它。
在这种情况下,我们采用另一种方法,我们称之为制表。