我刚读了this short post about mental models for Recursive Memoization vs Dynamic Programming, written by professor Krishnamurthi。其中,Krishnamurthi表示memoization的自上而下结构为递归树,sink vertex表示dp的自下而上结构为dag,其中源顶点是求解的第一个(可能是最小的)子问题,表示最终计算(本质上,图与上述递归树相同,但所有边都翻转)。很公平;这完全有道理。
不管怎样,到最后,他给读者一个心理锻炼:
记忆是一种自顶向下的、深度优先的计算优化。
想知道答案。dp是自底向上、广度优先的优化
计算答案。
我们自然应该问
自上而下,广度优先
自下而上,深度优先
它们放在哪里
避免通过交换重新计算的技术空间
时间的空间?
我们已经有他们的名字了吗?如果是,怎么办?,或
我们错过了一两个重要的把戏吗?,或
我们没有这些名字是有原因的吗?
然而,他停在那里,没有对这些问题发表自己的看法。
我迷路了,但这里有:
我的解释是,自上而下、广度优先的计算需要为每个函数调用单独的过程。一个自下而上的,深度优先的方法将不知何故拼凑出最终的解决方案,因为每个跟踪到达“汇顶点”。一旦所有的电话都接通了,这个解决方案最终会“叠加”到正确的答案上。
我有多便宜?有人知道他三个问题的答案吗?
最佳答案
@AndyG's comment基本上就是这个问题。我也喜欢@shebang's answer,但这里有一个直接在这个上下文中回答这些问题,而不是通过还原到另一个问题。
只是不清楚自上而下、广度优先的解决方案会是什么样子。但是,即使您以某种方式暂停计算以不进行任何子计算(可以想象各种基于连续性的方案可能会启用此功能),这样做也没有意义,因为子问题是共享的。
同样,目前还不清楚自下而上、深度优先的解决方案是否能够解决问题。如果你自下而上地进行计算,但是一直往上计算,但是其他子问题的解决方案还没有准备好,而且还在等待,那么你就是在计算垃圾。
因此,自上而下、广度优先没有任何好处,而自下而上、深度优先甚至都无法提供解决方案。
顺便说一句,以上博文的最新版本现在是my text中的一个部分(这是2014版;expectupdates)。
关于algorithm - 如果备忘录是自上而下的深度优先,而DP则是自下而上的广度优先;自上而下的广度优先和自下而上的深度优先等效是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27609246/