如何使用DFS算法查找最小的产品?

时间:2013-02-10 16:04:49

标签: java depth-first-search

我之前从未使用过DFS,我想知道如果你要遍历以下"树":

,如何使用它来找到路径中最小的产品
        3
      4   5
    7   6   4
  3   5   7   8
1   2   3   4   4

请参阅以下评论以清除任何混淆(:

1 个答案:

答案 0 :(得分:0)

您需要构建一个有向图,其中节点是数字,每个节点在下一级有一个数字/节点的2条边。此特定问题中的图表将是有向无环图。

然后,您只需在构建的图形上运行DFS。但是,您不会跟踪/检查您之前是否访问过某个节点,因为您想重新访问它们。相反,您只需要检查当前节点是否具有0 out-degree 或节点(因为底部的节点将具有0 out-degree ),并更新到达底部节点时的当前最小值。 (您也可以跟踪当前深度,并在达到深度时更新当前最小值)。我们可以针对这个特殊问题做到这一点,因为所有产品都是正好乘以5个数字的结果,每个数字一个。

我上面描述的是DFS的树搜索变体,与普通的图搜索变体相比,您可以跟踪之前是否访问过某个节点。当图中有一个循环时,树搜索DFS会卡住,但由于这是一个有向无环图,我们不会遇到这样的问题。


如果数字全部为非负,我们可以观察到:无论我们如何从根到达节点,前面的最佳路径每次都是相同的。

在这种情况下,从底部节点向后工作会更快。对于与同一“父”节点相邻的每对,选择较小的一对并乘以“父”节点。继续这样做,直到到达根节点,然后你就会得到结果。


如果数字可以正数或负数或0 ,则需要跟踪4个数字:绝对值最大和最小的负产品,最大和最小正产品。而且您还需要跟踪是否可以形成0产品。 2个最大绝对值是正x负的情况。 2个最小绝对值适用于正x正负x负的情况。在算法开始时,所有这5个字段都是未定义的。

如何更新的详细信息留给读者。应按顺序检查结果:绝对值最大的负数,0,绝对值最小的正数。如果该字段未定义,则跳过它并检查下一个字段。