Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如果记忆是自上而下的深度优先,而DP是自下而上的广度优先,那么自上而下的广度优先/自下而上的深度优先等价物是什么?_Algorithm_Recursion_Call_Dynamic Programming_Memoization - Fatal编程技术网

Algorithm 如果记忆是自上而下的深度优先,而DP是自下而上的广度优先,那么自上而下的广度优先/自下而上的深度优先等价物是什么?

Algorithm 如果记忆是自上而下的深度优先,而DP是自下而上的广度优先,那么自上而下的广度优先/自下而上的深度优先等价物是什么?,algorithm,recursion,call,dynamic-programming,memoization,Algorithm,Recursion,Call,Dynamic Programming,Memoization,我只是看书。其中,将Memorization的自上而下结构表示为递归树,将DP的自下而上结构表示为DAG,其中源顶点是第一个(可能是最小的)已解决的子问题,而源顶点是最终计算(基本上,图形与前述递归树相同,但所有边都翻转)。很公平,这很有道理 总之,最后他给了读者一个心理训练: 记忆化是自上而下、深度优先计算的优化 我想知道答案。DP是自下而上、广度优先的优化 计算答案 我们自然应该问,你呢 自上而下,广度优先 自下而上,深度优先 它们适合在哪里 通过权衡避免重新计算的技术空间 时间的空间

我只是看书。其中,将Memorization的自上而下结构表示为递归树,将DP的自下而上结构表示为DAG,其中源顶点是第一个(可能是最小的)已解决的子问题,而源顶点是最终计算(基本上,图形与前述递归树相同,但所有边都翻转)。很公平,这很有道理

总之,最后他给了读者一个心理训练:

记忆化是自上而下、深度优先计算的优化 我想知道答案。DP是自下而上、广度优先的优化 计算答案

我们自然应该问,你呢

  • 自上而下,广度优先
  • 自下而上,深度优先
它们适合在哪里 通过权衡避免重新计算的技术空间 时间的空间

  • 我们已经有他们的名字了吗?如果是,什么?或者
  • 我们错过了一两个重要的技巧吗
  • 我们没有这些名字有什么原因吗
然而,他停在那里,没有给出他对这些问题的想法。


我迷路了,但这里说:

我的解释是,自顶向下、广度优先的计算需要对每个函数调用进行单独的处理。自底向上、深度优先的方法会以某种方式将最终解决方案拼凑在一起,因为每条轨迹都到达“汇顶点”。一旦打完所有电话,解决方案最终将“相加”为正确答案


我现在怎么样了?有人知道他的三个问题的答案吗?

让我们分析一下这两张图中的边是什么意思。从子问题a到b的边表示一种关系,其中b的解用于a的计算,并且必须在其之前求解。(在另一种情况下,则相反。)

我想到拓扑排序了吗?

进行拓扑排序的一种方法是执行深度优先搜索,然后在离开每个节点时对其进行处理。这本质上就是递归记忆所做的。从每个子问题开始,您首先深入到每个子问题,直到遇到一个您尚未解决的问题(或您尚未访问的节点)并解决它

动态规划,或自下而上的广度优先问题解决方法,涉及解决较小的问题,并从中构造出较大问题的解决方案。这是进行拓扑排序的另一种方法,在这种方法中,您可以访问in度为0的节点,对其进行处理,然后将其删除。在DP中,最小的问题首先得到解决,因为它们的程度较低。(较小的是对手头问题的主观判断。)

这里的问题是生成一个序列,其中必须解决一组子问题。自上而下的宽度优先和自下而上的深度优先都不能做到这一点。 自上而下的广度优先最终仍将执行与深度优先计数器部分非常相似的操作,即使进程被分成线程。有一个解决问题的顺序。 自下而上的深度优先方法可能能够部分解决问题,但最终结果仍然类似于广度优先的计数器部分。子问题将以类似的顺序解决

考虑到这些方法与其他方法相比几乎没有任何改进,不能很好地进行类比,而且实现起来很繁琐,因此它们还没有很好地建立起来。

在这一点上非常重要。我也喜欢,但这里有一个直接回答了这些问题,在这方面,不是通过减少到另一个问题

只是不清楚自上而下、广度优先的解决方案会是什么样子。但是,即使您以某种方式暂停了计算,不进行任何子计算(可以想象各种基于延拓的方案可能会实现这一点),这样做也没有意义,因为子问题将共享

类似地,自下而上、深度优先的解决方案是否能够解决问题还不清楚。如果你自下而上进行计算,但一路向上收费,但其他子问题的解决方案还没有准备好并等待,那么你就是在计算垃圾

因此,自上而下、广度优先并没有任何好处,而自下而上、深度优先甚至并没有提供解决方案


顺便说一句,上述博文的最新版本现在是中的一部分(这是2014年版;期望。

为糟糕的标题道歉;我找不到一种简洁的方式来表达这个问题,因为它是针对我引用的博文:)自上而下的广度优先是一种蛮力解决方案:-)@AndyG现在你提到它,自下而上的深度优先听起来像是一种蛮力解决方案,而自上而下的广度优先对我来说更像是一种分而治之的方法。有什么想法吗?好吧,你可以采用自上而下的广度优先的方法,这样重叠的子问题仍然相互映射,但是你也可以在这一点上先做自上而下的深度优先,这就导致了记忆化。在许多情况下,自下而上的深度优先是不可能的。如果是,那么我们就不需要DP;我们可以直接到树上去寻找解决方案。实际上,树的较高级别取决于下面级别的最大或最小值。深度优先、自下而上的方法将神奇地绕过这种计算。@AndyG是的,观点很好。看来,这两种模式都是可能的,但没有价值。