繁体   English   中英

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

[英]How to use a DFS algorithm to find the smallest product?

我以前从未使用过DFS,并且想知道如果要遍历以下“树”,如何使用DFS查找路径的最小乘积:

        3
      4   5
    7   6   4
  3   5   7   8
1   2   3   4   4

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

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

然后,您只需在构造的图形上运行DFS。 但是,由于要重新访问节点,因此您不会跟踪/检查您是否曾经访问过该节点。 取而代之的是,您只需要检查当前节点是否具有0 out-degree或node(因为底部的节点将具有0 out-degree ),并在到达底部的节点时更新当前的min。 (您也可以跟踪当前深度,并在达到该深度时更新当前最小值)。 我们可以针对这个特定问题执行此操作,因为所有乘积都是乘以5个数字而得的结果,每个数字一个。

我上面描述的被称为DFS的树搜索变体,而普通的图搜索变体则可以跟踪以前是否访问过节点。 当图中有一个循环时,树搜索DFS将卡住,但是由于这是有向无环图,因此我们不会遇到这种问题。


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

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


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM