微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决O(|V| * k) 是否等于 O(|E|)?

我假设在表示邻接列表时,我们需要遍历所有顶点及其邻居,因此构建邻接列表的时间复杂度为 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)?

解决方法

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

是的。

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

此定义不正确,因为 k 取决于 “特定顶点”`,因此您需要将其定义为最大度数(顶点具有的最大边数)以便有一个可用的定义。


注意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|) 比从 “顶点和它们的出边”角度看它使事情变得过于复杂要简单得多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。