【问题标题】:Generating reachability matrix from a given adjacency matrix从给定的邻接矩阵生成可达矩阵
【发布时间】:2016-05-12 15:40:48
【问题描述】:

从给定的邻接矩阵生成可达矩阵的最佳算法是什么。有warshall的算法,但它不是最好的方法。还有一些其他方法,但程序更具理论性。是否有任何模块或我可以轻松创建可达性矩阵。我正在开发 python 2.7。

【问题讨论】:

  • 有向图还是无向图?为什么 Floyd-Warshall 的算法“不是最好的”?毫无疑问,那里有很多实现,但是您的图表的更多细节会有所帮助..
  • 为什么不是简单的 BFS 或 DFS。
  • @j_random_hacker 邻接矩阵的 n 次方中的条目计算顶点之间长度为 n 的游走数。这通常可能不会收敛。
  • @gilleain 我有一个 KxK 矩阵,其中 K>=10000。对于这样的矩阵,顶点数最少为 10000。warshall 算法的时间复杂度为 O(V^3)。因此,对于这种邻接矩阵,它不是一个好的算法。该图是一个包含循环的有向图。它不一定总是一个连通图。

标签: python algorithm matrix


【解决方案1】:

在有向图的一般情况下,我认为没有比 O(n³) 更快的方法。

话虽如此,您可以尝试使用巧妙的技术来减少常数。

例如,您可以执行以下操作:

  1. 通过查找所有strongly connected components 并将它们替换为单个顶点,将您的图形转换为DAG。这可以在 Θ(V + E) 或 Θ(V²) 中完成

  2. 在新图上,运行 DFS 以计算所有顶点的可达性,但是,当更新顶点的可达性集时,以快速矢量化的方式进行。这在技术上是 Θ( (V + E) * V ) 或 Θ(V³),但常数会很低(见下文)。

建议的矢量化方法是将每个顶点的可达性设置为位向量,驻留在 GPU 上。这样,两组并集的计算在GPU上以极快的并行方式进行。您可以为 GPU 使用任何张量库,例如,tf.bitwise

在 GPU 上计算每个顶点的可达性位向量后,您可以在 Θ(V²) 时间内将它们提取到 CPU 内存中。

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多