【问题标题】:Is O(|V| * k) equal to O(|E|)?O(|V| * k) 是否等于 O(|E|)?
【发布时间】:2021-01-21 11:31:42
【问题描述】:

我假设在表示邻接表时,我们需要遍历所有顶点及其邻居,因此构建邻接表的时间复杂度为 O(|V| * k) 其中 V 是顶点的集合,k是某个顶点具有的邻居数(如果图完整,则 k = |V| - 1)。然而,我遇到的每个资源都表明构建邻接表的时间复杂度是 O(|E|),其中 E 是边的集合。

由于我们正在考虑最坏情况,因此图的最坏情况是连通图,其中 |E|等于 (|V| 2) = (|V| * (|V|-1))/2。如上所述,从完整图构建邻接列表需要遍历所有顶点及其邻居。该操作的时间复杂度为 |V| * k 其中 k 是 |V|-1。所以,它应该是 O(|V| * (|V|-1)) => O(|V|^2)。 既然我们发现边数是(V * (V-1)) / 2 => O(|V|^2),那么两个复杂度O(|V| * k)和O(|E| ) 应该是一样的。

让我困惑的是为什么人们更喜欢使用 O(|E|) 而不是 O(|V| * k)?

【问题讨论】:

    标签: algorithm graph big-o complexity-theory


    【解决方案1】:

    O(|V| * k) 是否等于 O(|E|)?

    是的。

    其中 V 是顶点的集合,k 是某个顶点的邻居数

    这个定义是不正确的,因为 k 取决于 "the certain vertex"` 所以你需要将它定义为最大度数(一个顶点的最大边数),以便有一个可用的定义。


    注意max-degreeO(maxdeg * |V|) 不等于O(|E|)。最大度数是比|E| 更差的复杂度近似值。

    想象一下一个图,其中一个顶点有1_000 边,但其他所有顶点只有1 边。

    但是由于Big-O只定义了上界,算法当然还是在O(maxdeg * |V|)中。


    在任何情况下,您最多只能在图中的每条边上查看一次,所以|E|。边的数量是所有顶点的所有出边的总和,即您试图用|V| * k 制定的内容。所以两者是完全一样的。即

    |E| = sum (v * outdegree(v))
    

    k 在这种情况下不是最大度数,而是每个v 特定的出度数)

    让我困惑的是为什么人们更喜欢使用 O(|E|) 而不是 O(|V| * k)?

    一般而言,将图视为具有顶点和边的实体更为常见,其操作取决于VE。只说O(|E|) 比从“顶点及其出边”角度来看待事情过于复杂化要简单得多。

    【讨论】:

    • 如果将k定义为最大度数,则有k*|V|的图比 |E| 增长更快(二次方) (线性)
    • 所以人们喜欢使用 O(|E|) 的原因是因为方便。我在k 中的意思是顶点的最大度数,在完整图的情况下,它是 (n-1)。无论如何,谢谢你的回答!
    • @Henry 没错。但不要忘记O(...) 定义了一个上限。所以这个说法仍然成立。但可以肯定的是,Big-O 类的估计更差。
    • 好吧,严格来说没有。如果 k 是最大度数,则 O(|V| * k) 等于 O(|E|) 是不正确的。如果 k 是平均度数,它将成立。
    • @Henry 这就是我的意思,如果不清楚,抱歉。 IE。 algorithm \in O(|E|) \subset O(|V| * k)。紧随其后的是algorithm \in O(|V| * k)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2022-06-10
    相关资源
    最近更新 更多