【发布时间】:2020-01-16 11:59:17
【问题描述】:
是否有一种有效的算法将有向循环图作为输入并返回源自每个节点的每个子图的大小? “高效”是指比在每个节点上执行 DFS 更有效的东西。
【问题讨论】:
标签: language-agnostic graph-theory subgraph
是否有一种有效的算法将有向循环图作为输入并返回源自每个节点的每个子图的大小? “高效”是指比在每个节点上执行 DFS 更有效的东西。
【问题讨论】:
标签: language-agnostic graph-theory subgraph
DFS 花费的时间与每个节点可到达的边数成正比,这可能是 O(E),因此从每个节点执行 DFS 是 O(VE),其中 V 是顶点数,E 是边数.假设平均图有 O(V^2) 条边,这在平均情况和最坏情况下是 O(V^3)。在最好的情况下,重复的 DFS 在没有边的图上花费 O(V) 时间。
一个比这更好的简单方法 - 至少在理论上 - 是采用adjacency matrix A,沿对角线写入 1,以便每个节点都可以从自身到达,找到与 - 或矩阵幂 A^( V-1),然后计算每行 1 的个数。这种方法的时间复杂度是:
time complexity of matrix multiplication 可以低至 O(n^2.373) 左右,具体取决于您使用的算法,因此上述算法的整体复杂度约为 O(V^2.373 log V)。这在平均情况和最坏情况下都超过了重复 DFS,但在最好情况下却不是。
也就是说,这个答案纯粹是理论上的,因为实现低时间复杂度的矩阵乘法算法通常具有相当大的常数因子,因此对于合理大小的矩阵,它们实际上并不是更快。它也可能不是你能做的最好的;但它确实回答了“有没有更有效的东西”这样的存在性问题。
【讨论】: