Algorithm 图上的所有对和所有路径

Algorithm 图上的所有对和所有路径,algorithm,path,runtime,hadoop,graph-traversal,Algorithm,Path,Runtime,Hadoop,Graph Traversal,这可能是一个没有最佳解决方案的问题。假设我有一个有向图,不知道它是否有循环(循环检测将是这个问题的一个方面)。给定一组顶点(可能有数百万个顶点),我需要计算给定图的所有唯一对之间的所有不同路径(没有重复顶点的路径)。我将如何着手处理这种情况 让我们来看看一种暴力方式: 从图中计算所有可能的对 对于每对图,使用DFS获取从源到目标的所有路径 目的地 假设这些对在哈希表中表示,则将路径计数作为该对的值 对其余的一对重复上述步骤 人们能指出这件事会出什么问题吗?让我们以这种方式来思考这个问题,找到

这可能是一个没有最佳解决方案的问题。假设我有一个有向图,不知道它是否有循环(循环检测将是这个问题的一个方面)。给定一组顶点(可能有数百万个顶点),我需要计算给定图的所有唯一对之间的所有不同路径(没有重复顶点的路径)。我将如何着手处理这种情况

让我们来看看一种暴力方式:

  • 从图中计算所有可能的对

  • 对于每对图,使用DFS获取从源到目标的所有路径 目的地

  • 假设这些对在哈希表中表示,则将路径计数作为该对的值
  • 对其余的一对重复上述步骤
人们能指出这件事会出什么问题吗?让我们以这种方式来思考这个问题,找到地球上所有城市之间所有不同路径的计算挑战是什么?如果一个人试图解决这个问题,从哪里开始


编辑:介绍的一些算法在O(n!)阶乘时间内产生结果。对于一台资源有限的机器来说,这是一个令人畏惧的计算。有谁知道map reduce技术可以将图形遍历问题分解为更小的块吗?

您想过有多少这样的路径可以存在吗

在这样一个有V个顶点的图中,大约有V^2个不同的对。让我们想象一个最糟糕的场景,在这个场景中,您有一个完整的图(每对图之间都有边)。路径可以在1边和V-1边之间的任意位置,因为不允许在路径中重复顶点

在每对顶点之间:

  • 只有一条路径有一条边
  • 有两条边的V-2路径:使用不是原点或目标的任何中间顶点
  • 有三条边的(V-2)(V-3)路径:使用任意两个不同的中间顶点
  • 存在具有4条边的(V-2)(V-3)(V-4)路径
  • 存在具有n条边的prod{k=1->n-1}(V-k-1)路径
  • 考虑到这一点,我们知道对于一个有V个顶点的图,最多有V^2*sum{i=1->V-1}(prod{k=1->i-1}(V-k-1))条总路径

    因此,路径的总数是p(V)=V^2*sum{i=1->V-1}(prod{k=1->i-1}(V-k-1))=V^2*sum{i=1->V-1}(O(V^V))=O(V^3*V^V)=O(V!)

    现在想象一个理想的世界,你可以在恒定的时间内计算每条路径。您的算法需要O(1*V!)=O(V!)时间才能运行,这是不合法的


    可能有一种算法可以在不枚举路径的情况下对路径进行计数,从而获得更有效的算法。

    介绍了一种DFS方法,用于打印任意两个顶点之间的所有非循环路径,它还包括java代码。您可以修改它以查找所有顶点对的所有此类路径,但这不是计算所有顶点之间所有路径的最有效方法。

    获得路径粗略近似值的Floyd Warshall推广如下:

     procedure FloydWarshall ()
        for k := 1 to n
           for i := 1 to n
              for j := 1 to n
                 path[i][j] = path[i][j] + path[i][k]*path[k][j] 
    
    这里有一个非常粗略的想法,如何衡量这一点。免责声明-这不是具体的-这是非常手波浪,但希望它有助于更多的困惑。这有助于理解算法的工作原理。它从图的邻接矩阵开始。在每次迭代k中,从i到j的路径数等于之前从i到j的迭代中的路径数加上通过k从i到j的路径数


    因此,将图分解为大小为k x k的n个任意子邻接矩阵,对每个子邻接矩阵进行上述计算。现在你有了路径的数量,并开始通过在组合矩阵上重新计算上面的部分来组合子矩阵。也就是说,在重新组合时,我们只需要重新计算k的n/2值。我发现了这一点,看起来方向类似。

    找到周期后,您希望如何处理它们?假设给定一个图{(a,B),(B,C),(C,a),(C,D)}。在a和D之间有无数不同的路径:ABCD,ABCABCD,ABCABCD,ABCABCD。。。任何循环图的所有对之间都有无限多条不同的路径。假设你在第一次通过时标记你的顶点。在这种情况下,唯一不同的路径是ABCD。进入A->B->C->D。任何重新访问顶点的遍历都将被放弃。@sc\u-ray将该限制添加到您的问题中会得到更好的答案。“不同的路径”和“没有重复顶点的路径”不是同一回事。@Martinho Fernandes-注意点。更新post@spinning_plate:因为它需要所有对之间的所有路径,是的,ABC是a和C之间的路径。但当然不是a和D之间的路径。有人能告诉我如何“数学化”我的总和和乘积吗?谢谢你的分析。我认为这将是一些像O(V!)一样的淫秽运行时。我正在寻找实用的策略来解决这种规模的问题;和Π(符号(&S)后没有空白)。请参见,这不取决于执行的顺序吗?例如,如果先在ik和kj上运行正确的迭代,从i到j到k的路径难道不存在吗?因为k是增量,我们构建了越来越长的路径。我们朝哪个方向走这些漫长的道路并不重要。