【问题标题】:Topological sort complexity in linear time?线性时间的拓扑排序复杂度?
【发布时间】:2021-10-18 20:30:30
【问题描述】:

我正在尝试计算用python实现的卡恩算法的算法复杂度,我偶然发现了这篇文章:https://www.geeksforgeeks.org/topological-sorting-indegree-based-solution/ 在计算所有节点度的代码部分有这个

for each node in Nodes
    If (list[node].size()!=0) then
        for each dest in list
            indegree[dest]++;

在文章中说复杂度是 O(V+E),但为什么呢? fors有两个嵌套,不应该是O(V*E)吗?

我在 python 中写了一个类似这样的实现:

for vertex in graph:                    # O(V) * O(E) = O(V * E). ??
    for edge in graph[vertex]:          # O(E)+O(1) => O(E)
        indegree[dege] += 1             # O(1)

V = 图的顶点数

E = 边数

【问题讨论】:

    标签: python-3.x time-complexity complexity-theory topological-sort


    【解决方案1】:

    这是图形算法中常用的表示法,用于指定算法对图形密度的依赖程度。 E 始终是 O(V^2),但这个界限可能并不紧密。假设没有很多边(例如,一棵树,其中正好有 V - 1 边)。然后O(V + E) = O(V + V) = O(2V) = O(V)

    现在考虑一个密集图(例如,一个完整图,其中至少有 V(V-1) 边,如果允许自边,则更多)。现在O(V+E) = O(V + V^2 - V) = O(V^2)

    O(...) 内部,+ 的行为有点像max:整体复杂性由两个加数中的较大者决定。这基本上为您提供了一种简写方式,用于显示复杂性如何沿两个轴增长:一个是顶点数,二是边的密度。

    【讨论】:

      【解决方案2】:

      具体来说,复杂度将更准确地表述为V + 2E(其整体复杂度等级为O(V + E)。我们对每个顶点仅迭代一次,每条边恰好迭代两次(对于它所附加的每个顶点一次)-假设graph[vertex] 只返回连接到该顶点的边,这似乎是算法的意图。

      嵌套循环确实 通常表示* 而不是+,这涉及到复杂性。但是,如果内部循环正在迭代与外部循环不同的东西,我们有时会遇到这样的情况 - 在 all 内部循环中存在特定且恒定数量的事物,以某种方式分布在外循环。

      在这种情况下,我们确实可以将复杂度写为O(V + E),因为我们迭代的E 的数量与我们迭代的V 的数量没有任何关系——只是顺序我们在其中这样做,复杂性并不真正关心。

      【讨论】:

        猜你喜欢
        • 2016-11-27
        • 1970-01-01
        • 2021-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多