【问题标题】:Finding out paths in a graph of 175K nodes在 175K 节点的图中找出路径
【发布时间】:2012-12-04 03:03:51
【问题描述】:

我在大数据分析中遇到了一个问题,我正在使用 Dijkstras 算法为具有超过 175K 个节点的图找出路径。但问题是我不知道特定源和目的地是否存在路径。我必须为大约 1000 个来源和目的地执行此操作。但是我不能随机选择它们,因为我不确定它们之间是否存在路径。我不确定如何处理。在 MapReduce 环境中执行一次算法在本地需要大约 15 分钟的时间。因此,反复试验不是一种选择。只有我能找到至少 1000 个源和目标是找到循环(?)或强连接组件?它是否正确 ?我希望我的问题很清楚。

我基本上是在寻找 1000 对源和目标对,它们的路径存在于该大小的图中

【问题讨论】:

  • 那么您是否正在寻找一种方法来查找节点 dest 是否可以从节点 src 访问?
  • 我基本上是在寻找 1000 对源和目标对,它们的路径存在于该大小的图中
  • 对这些配对有什么限制吗?或者它们可以是完全任意的吗?
  • 你能告诉我们你用 mapreduce 做了什么吗?
  • 我认为 igraph (igraph.sf.net) 可以轻松处理 175k 个顶点,因此您可以切换到它。当然,这也取决于图形的密度。免责声明:我是 igraph 的作者之一。

标签: algorithm graph graph-theory dijkstra


【解决方案1】:

我建议随机选择 1000 个源节点,然后为每个节点运行 Breadth-First-Search,直到您访问了 k 节点。然后,选择您要访问的下一个节点并将其设置为该源的目的地。

使用此方法,您可以确保每个目的地都可以从该来源到达。

【讨论】:

  • 为什么要打扰 BFS?只需选择一个随机节点作为源,并将其邻居之一作为目标,无需搜索。
  • @jwpat7 那是k = 0 的情况,对吧?我认为 BFS 给了你一个更“有趣”的问题。
  • 但是问题陈述没有提到任何路径长度,只是要求存在路径。让 k=0 保持简单;鉴于问题陈述,k>0 是不必要的复杂情况。
  • @jwpat7 严格来说,是的。但我对 OP 的解释是,他希望能够执行 Djikstra 的非平凡执行。挑选邻居不会导致这种情况。
  • 我认为这里的讨论是关于偏见的。即使使用k > 0,在选择对时也存在偏差,这可能是一个问题,因为应用程序似乎是数据分析。 OP 需要根据采样过程的特点明确他们的要求。
【解决方案2】:

我们可以使用像 disjoint-union-set(DUS) 这样的数据结构。我们进行初始化以获得整个图的连通性。如果 a 可以到达 b,它们将位于 DUS 中的同一组中。初始化的复杂度完全取决于图中的边数。并且查询大约是 O(1)。

【讨论】:

  • 这在无向图中有效,但在有向图中,a 可以从 b 访问,而 b 不能从 a 访问,我认为 DUS 不行可以表示。
  • @SamMussmann 是的,你是对的,这个算法只适用于无向图。
【解决方案3】:

这是我建议的算法:

findPairsPath ()
{
    define 2D Array SD //holds source-destination nodes
    SD = {}
    pick any node u randomly
    k=0

    while (k<1000)
    {
       DFS (u, k)
       pick any node u randomly not stored in SD 
    }
}

DFS (u, k)
{

    for all nodes v adjacent to u and not stored in SD
     {
       store (u,v) in SD //storing a source and a destination
       k++
       DFS (v,k)

     }

}

【讨论】:

    猜你喜欢
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2011-12-19
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多