如何解决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-degree,O(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)?
一般来说,更常见的是将图视为具有顶点和边的实体,操作依赖于 V
和 E
。只说 O(|E|)
比从 “顶点和它们的出边”角度看它使事情变得过于复杂要简单得多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。