【发布时间】:2011-03-09 17:38:41
【问题描述】:
这可能是一个可能没有最优解的问题。假设我有一个有向图,不知道它是否有任何循环(循环检测将是这个问题的一个方面)。给定一组顶点(可能是数百万个顶点),我需要计算给定图的所有唯一对之间的所有不同路径(没有重复顶点的路径)。我将如何处理这种情况?
让我们看看一个蛮力的方法来做到这一点:
从图中计算所有可能的对。
对于每对图,使用 DFS 获取从 Source 到的所有路径 目的地。
- 假设这些对在哈希表中表示,将路径计数作为该对的值。
- 对其余的对重复此操作。
人们能指出哪些地方可能会出错吗?让我们以这种方式思考这个问题,找到地球上所有城市之间的所有不同路径的计算挑战是什么?如果有人尝试解决这个问题,应该从哪里开始?
编辑:提出的一些算法在 O(n!) 阶乘时间内产生结果。对于资源有限的单台机器来说,这是一个令人生畏的计算。有谁知道 map-reduce 技术可以将图遍历问题分解成更小的块?
【问题讨论】:
-
当你找到周期时,你想如何处理它们?比如说,给定一个图 {(A,B), (B,C), (C,A), (C,D)}。 A 和 D 之间有无数条不同的路径:ABCD、ABCABCD、ABCABCABCD、ABCABCABCABCD...任何循环图在其所有对之间都有无数条不同的路径。
-
好吧,假设是您在第一次通过时标记了顶点。在这种情况下,唯一不同的路径是 ABCD。你去A->B->C->D。任何重新访问顶点的遍历都将被丢弃。
-
@sc_ray 将该限制添加到您的问题中将为您提供更好的答案。 “不同的路径”和“没有重复顶点的路径”不是一回事。
-
@Martinho Fernandes - 得分。更新了帖子
-
@spinning_plate:因为它需要所有对之间的所有路径,是的,ABC 是 A 和 C 之间的路径。但当然不是 A 和 D 之间的路径。
标签: algorithm path runtime hadoop graph-traversal