使用深度优先搜索找到所有简单路径的复杂性?

时间:2009-12-02 04:12:27

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

感谢大家回复想法和替代解决方案。总是欢迎更有效的解决问题的方法,以及提醒我质疑我的假设。也就是说,我希望你暂时忽略我试图通过算法解决的问题,并且只是帮助我分析算法的大复杂性 - 就像我写的那样 - 一个简单的路径在使用如here所述的深度限制搜索的图表中,并实施了here。谢谢!

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


以下原始问题:

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

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

相关SO问题herehere

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

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

4 个答案:

答案 0 :(得分:5)

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

你要解决的问题是什么?

答案 1 :(得分:1)

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

如果您愿意,可以使用广度优先搜索(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是图形深度(参见{{3})有关更多信息)。那么考虑到那里有多少演员,那会是什么?鉴于你对这个问题的了解(6度,什么不是),会是什么?

我想我可能已经说够了。希望能为你启动它。我应该添加一些警告,我实际上并不确切地知道答案,这就是我遇到的问题;)

答案 2 :(得分:1)

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

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).

答案 3 :(得分:0)

我在考虑使用 O((n ^ 2)*深度)algorhitm

  1. 对于每个演员找到他正在工作的所有演员。 (O(n ^ 2)空间和时间的复杂性,但两者都取决于实际的连接数,对于大多数演员而言,在facebook上不超过500或5倍的朋友数量。这会带来500 * n的时间和空间复杂度。

  2. 将整个三人组装在同一深度的所有人身上并追加所有这些联系。为O(n ^ 2 *深度)

  3. 如果使用双向链接树存储连接,则可以找到所有深度连接* n复杂度