【问题标题】:Efficient algorithm to find all paths between two nodes查找两个节点之间所有路径的高效算法
【发布时间】:2012-12-30 10:17:08
【问题描述】:

我目前正在研究递归 DFS,以检索无向和未加权图中两个节点之间的所有路径。它在保存路径的同时递归地获取开始和结束节点以及节点及其相邻节点上的DFS。 我想知道是否有更有效的方法来查找所有路径?

【问题讨论】:

  • 如果你想找到所有的路径,那么你必须遍历它们......你只是想找到路径的数量吗?那么可能会有更快的方法。
  • 如果您只对数字感兴趣,可能会有更有效的算法
  • @irrelephant 我想在这些路径上的节点上做一些工作;因此我需要找到所有路径并保存它们,而不仅仅是它们的编号。

标签: performance algorithm graph time-complexity path-finding


【解决方案1】:

有指数级数量的简单路径,而 DFS 基本上将它们全部创建为 0,因此您的方法是正确的,尽管很耗时(但这是问题本身的一部分,而不是算法的一部分)。

如果存在这样的节点,您可以通过从图中消除不通向目标的节点来稍微优化它 - 在计算它们之前有效地修剪不成功的搜索。

请注意,如果图形包含循环 - 可能有无限数量的路径(尽管有限数量的简单路径)。请注意,为避免无限循环并获取所有简单路径,您的 DFS 将需要维护一个 visited 集,该集根据路径进行修改(一旦“发现”一个节点将其插入到集,并且一旦从堆栈中弹出,将其从集合中移除)。

【讨论】:

  • 谢谢,已经涵盖了访问集和无限循环问题。这样的代码的时间复杂度是多少,我有点不确定?
  • @Ever:算法是O(n!),考虑一个集团,在源头你有n-1个节点要访问,然后是n-2,n-3,...直到你到达目标。这将单独导致O((n-1)!),但您需要一个额外的n 来处理发现的每个路径中的每个节点。
【解决方案2】:

你可以适配 Dijkstra 的算法,另见A Recursive Algorithm to Find all Paths Between Two Given Nodes

【讨论】:

  • 我已经做了一个类似于你提供的递归算法。但是我怎样才能为此目的调整 Dijkstra 算法呢?
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2014-07-09
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多