【问题标题】:Size of each subgraph originating from each node in a directed cyclic graph源自有向循环图中每个节点的每个子图的大小
【发布时间】:2020-01-16 11:59:17
【问题描述】:

是否有一种有效的算法将有向循环图作为输入并返回源自每个节点的每个子图的大小? “高效”是指比在每个节点上执行 DFS 更有效的东西。

【问题讨论】:

    标签: language-agnostic graph-theory subgraph


    【解决方案1】:

    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 的个数。这种方法的时间复杂度是:

    • O(V^2) 构建邻接矩阵,
    • O(f(V) * log V) 计算矩阵幂,使用square-and-multiply algorithm 进行 log V 矩阵乘法,其中 f(V) 是矩阵乘法算法的复杂度,
    • O(V^2) 来计算每行结果中的 1。

    time complexity of matrix multiplication 可以低至 O(n^2.373) 左右,具体取决于您使用的算法,因此上述算法的整体复杂度约为 O(V^2.373 log V)。这在平均情况和最坏情况下都超过了重复 DFS,但在最好情况下却不是。

    也就是说,这个答案纯粹是理论上的,因为实现低时间复杂度的矩阵乘法算法通常具有相当大的常数因子,因此对于合理大小的矩阵,它们实际上并不是更快。它也可能不是你能做的最好的;但它确实回答了“有没有更有效的东西”这样的存在性问题。

    【讨论】:

    • 感谢您的快速回答。它回答了我的问题,如果我们假设平均图与 O(V^2) 边有关,那么这个假设给了我们最坏的情况而不是平均情况。当然,任何关于存在解决问题的最优(在平均情况下)算法的 cmet 将不胜感激。如果不存在这样的算法,考虑到我对图论的不熟悉,任何关于其他可能适用于解决问题的算法的提示也是有用的。
    • O(V^2) 边是随机图的平均情况,也是最坏情况;有 V(V-1)/2 个可能的边,因此随机图将其中一半作为边,另一半作为非边,给出 V(V-1)/4 个边的平均值,在 O (V^2)。如果您的图表是从边缘不是随机的(具有固定概率)的其他分布中绘制的,那么该分布的平均图表可能具有少于 O(V^2) 的边缘;例如,如果您的图表始终是一棵树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2011-06-06
    • 2015-06-29
    相关资源
    最近更新 更多