【问题标题】:Complexity of finding all simple paths using depth first search?使用深度优先搜索查找所有简单路径的复杂性?
【发布时间】:2009-12-02 04:12:26
【问题描述】:

感谢大家回复的想法和替代解决方案。更有效的解决问题的方法总是受欢迎的,并且提醒我质疑我的假设。也就是说,我希望你暂时忽略我试图用算法解决的问题,并帮助我分析我的算法的复杂性,因为我已经编写了它——所有简单的路径在使用深度限制搜索的图中,如here 所述,并实现了here。谢谢!

编辑:这是作业,但我已经提交了这个作业,我想知道我的答案是否正确。当涉及到递归时,我对 Big-O 复杂性感到有些困惑。


原问题如下:

我试图找出this 算法给出的全路径搜索的复杂性。 给定两个顶点,我使用深度优先搜索找到它们之间的所有简单路径。

我知道 DFS 的时间复杂度是 O(V+E),它的空间复杂度是 O(V),我的直觉是全路径搜索的复杂度会更多,但是我'我无法确定它会是什么。

相关的 SO 问题 herehere

更新(回应下面的评论):

我正在尝试解决six degrees of Kevin Bacon 问题。这通常需要找到一对演员之间的最低分离度,但我必须找到所有的分离度(目前,小于 6,但这可以改变)。

【问题讨论】:

  • 我的实现实际上类似于 [here][1] 的描述,如果这有助于分析(这实际上是一个 DFS,即使它声称是一个 BFS!)。 [1]:stackoverflow.com/questions/58306/…
  • 路径可能呈指数级增长(例如,一个完整的图),因此仅输出将花费指数级时间。为什么要查找所有路径?
  • @ShreevatsaR:更大作业的一部分。我需要找到所有路径,我使用了这个算法。现在我很难表达它的复杂性(就 Big-Oh 而言)。另外,如果有更有效的方法来解决这个问题,那么我想知道。
  • 如果你只想找到“所有分离度数”,这只有 n 个可能的输出,并且比找到所有路径要简单得多。确定要查找所有路径吗?
  • @ShreevatsaR,我改写为“找到两个演员在 # 度内连接的所有可能方式”(其中 # 在最坏的情况下 = 演员的数量)怎么样。那不是万能的吗?

标签: algorithm graph big-o depth-first-search


【解决方案1】:

最坏的情况是(我认为)n 个顶点的完整图。此图有 n!简单的路径,并且对于它们中的每一个,您的算法至少执行 n^2 个计算步骤——对于与路径中最后一个相邻的每个顶点,它对先前的链表进行线性扫描访问过的节点。 (这还不包括搜索的所有中间阶段。)所以复杂度至少为 O(n^2 * n!),可能更糟。

您要解决的更大的问题是什么?

【讨论】:

  • 如果我知道图是稀疏的,那么它会变成 O(b! * n^2) 吗?
  • (其中b 是分支因子)
  • 我正在尝试解决凯文培根的六度问题 (en.wikipedia.org/wiki/Six_Degrees_of_Kevin_Bacon)。这通常需要找到一对演员之间的最低分离度,但我必须找到所有的分离度(嗯,小于 6(但这可以改变。))
  • 阶乘方面应该掩盖 n^2 因子中的乘数
  • @David 假设您使用深度优先搜索从所有路径中找到最短路径。复杂性是什么?我基本上使用深度优先搜索来计算所有路径,然后通过所有这些路径找到最短的路径。
【解决方案2】:

6 度很好,因为它给你一个限制。我意识到 6 可以改变,但我认为这里的方法仍然适用。在我说“6”的任何地方,只需替换为“# of degree”。

如果您愿意,可以使用广度优先搜索 (BFS)。如果我理解正确,您将获得一个起点(演员/女演员),您需要找到距离小于或等于 6 条边的端点(Kevin Bacon)的所有路径。你可以把它分解成子问题,首先找到所有距离 1 边的连接,然后找到所有距离 2 边的路径,...,最后找到所有距离 6 边的路径。这正是 BFS 的工作方式...首先检查一个边缘的所有节点,然后是两个,等等。

或者,您也可以使用修改后的深度优先搜索 (DFS),方法是执行正常的 DFS,并尽可能地沿着每条路径走,但要保留一个计数器并阻止它深入任何特定路径的 6 个以上边缘.

我认为您的解决方案可能会比正常的 O(V + E) 好得多,因为您可能不会访问所有顶点或沿所有边移动(假设我们的图表是大量参与者之间的关系),而是您被限制在整个图的子图上。你开始你的搜索算法,就像你要访问所有顶点/边一样,但无论你使用 BFS 还是 DFS,你都会在起始顶点的 6 个边处停止,而不是查看整个图形.

考虑像 DFS 这样的东西可以表示为 O(V+E),但它也可以表示为 O(b^d),其中 b 是分支因子,d 是图深度(参见Wikipedia_DFS for更多信息 )。那么考虑到有多少演员,b 会是什么?考虑到你知道的问题的限制条件(6 度和什么不是),d 会是什么?

我想我可能已经说得够多了。希望这会为您启动它。我应该补充一点,我实际上并不确定答案,这就是我遇到的问题;)

【讨论】:

  • 感谢您的回复,布伦特纳什。实际上,我已经解决了问题并实施了解决方案,只是复杂性分析我无法绕开。我确实在使用深度受限搜索(但对于 all 路径
  • 我想出了O((MAXDEPTH*b)^MAXDEPTH) 的时间复杂度和O(MAXDEPTH*b^MAXDEPTH) 的时间复杂度(基于伪代码分析——循环、递归等),但我不确定它是否正确
  • 很抱歉没有给你更多...我只是犹豫在家庭作业问题上提供太多额外的帮助。祝你好运!
【解决方案3】:

用我的分析回答我自己的问题,请评论/更正!

The algorithm is simplified and analyzed as follows: 
(Note: here MAXDEPTH is the maximum degrees of separation to search for, default 6)
1. For the current vertex, get neighbors (amortized O(1))
2. For every neighbor, do the following [O(b), where b is the branching factor, or the avg. number of neighbors of a vertex]
2.1.    Check if already visited [O(MAXDEPTH), since it’s a linked list of max size MAXDEPTH)
2.2.    Append path to paths list [amortized O(1)]
3. End for 
4. Do the following MAXDEPTH times [O(MAXDEPTH)]
4.1.    For every neighbor do the following [O(b)]
4.1.1.      Check if already visited [O(MAXDEPTH)]
4.1.2.      Add to visited list [O(1)]
4.1.3.      Recursively call search again [becomes O(MAXDEPTH*b)]
4.1.4.      Delete from visited list [O(1)]
4.2 End for /* Neighbor */
5. End loop /* MAXDEPTH */

Thus, the complexity becomes O((MAXDEPTH*b)^MAXDEPTH).

【讨论】:

    【解决方案4】:

    我在考虑使用 O((n^2)*depth) 算法

    1. 为每个演员找到他正在使用的所有演员。 (O(n^2) 空间和时间复杂度,但都取决于实际的连接数,对于大多数演员来说,Facebook 上的朋友数量不超过 500 或 5 倍)这带来了 500*n 的时间和空间复杂度。

      李>
    2. 将三个整体组合起来,以相同的深度遍历所有人并附加所有这些连接。 O(n^2*深度)

    如果您使用双链树来存储连接,您可以找到深度*n 复杂度的所有连接

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      相关资源
      最近更新 更多