原问题如下:
我正在尝试找出由此算法给出的所有路径搜索的复杂性。 给定两个顶点,我正在使用深度优先搜索查找它们之间的所有简单路径。
我知道DFS的时间复杂度为O(V + E),空间复杂度为O(V),我的直觉告诉我,所有路径的搜索复杂度将超过这个值,但是我无法确定它将是多少。
相关SO问题在此和在此。
更新(响应下面的评论):
我正在尝试解决六度分隔的凯文·贝肯问题。这通常需要查找一对演员之间最低的分隔度,但我必须找到所有的分隔度(目前小于6,但这可能会改变)。
通过我的分析回答自己的问题,请评论/纠正!
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).
6度关系的概念很好,因为它给了你一个限制。我知道这个“6”是可以改变的,但我认为这里的方法仍然适用。在任何我说到“6”的地方,只需替换成“#度关系”即可。
如果你愿意,你可以使用广度优先搜索(BFS)。如果我理解正确,你需要找到从起点(演员/女演员)到终点(凯文·贝肯)的所有路径,且路径长度小于或等于6。你可以将其分解为子问题,首先找到所有距离1度的连接,然后找到所有距离2度的路径,...,最后找到所有距离6度的路径。这正是BFS的工作原理...首先检查所有距离一个边缘的节点,然后是两个边缘,以此类推。
另外,你也可以使用修改过的深度优先搜索(DFS),通过进行普通的DFS并尽可能地沿着每条路径走得更远,但保持计数器不超过任何特定路径的6个边缘。
我认为你的解决方案可能比普通的O(V+E)更好,因为你可能不会访问所有顶点或沿着所有边行进(假设我们的图是大量演员之间的关系),而是受限于整个图的子图。你开始搜索算法时,就像你要访问所有顶点/边缘一样,但无论你使用BFS还是DFS,你都将在距离起始顶点6个边缘处停止,而不是查看整个图。
考虑到类似DFS的东西可以表示为O(V+E),但也可以表示为O(b^d),其中b是分支因子,d是图深度(有关更多信息,请参见Wikipedia_DFS)。那么,考虑到有这么多演员,b会是多少?鉴于您所知道的问题约束(6度等),d会是多少?
我想我可能已经说得足够多了。希望这能为您启动它。我应该补充说明,我并不确定答案,这只是问题对我的影响方式;)
O((MAXDEPTH*b)^MAXDEPTH)
和时间复杂度为O(MAXDEPTH*b^MAXDEPTH)
(基于伪代码分析——循环、递归等),但我不确定它是否正确。 - hexium我在思考使用O((n^2)*depth)算法
对于每个演员,找到他与之合作过的所有演员。(O(n^2)空间和时间复杂度,但两者都取决于实际连接数量,并且对于大多数演员不超过500或你Facebook上好友数量的5倍) 这将带来500*n的时间和空间复杂度。
整合整个树结构,遍历同一层级的所有人并添加所有这些连接。O(n^2*depth)
如果您使用双向链接树来存储连接,则可以在深度*n的复杂性中找到所有连接