使用数组的 Prims 的复杂性
Complexity of Prims using Array
使用数组和邻接表的Prims算法的复杂度为:
V^2 + V + 2E + E = O(V^2)
但是,我不记得为什么 E
。
使用邻接表结构表示图和使用数组表示优先级队列的复杂度为Θ(|V|2 + |E| )。对于没有平行边的图,这是 Θ(|V|2).
Prim 的算法在 |V| 次迭代中运行,生成一棵从大小 1 开始到大小 |V| 结束的树。说在一些迭代中,顶点 v 被添加到树中,并且 lete E(v) 是从 v 发出的边。对于每条这样的边,我们可以找到数组中的邻居,并更新从当前树中某个顶点到它的最轻距离。找到顶点 v 需要时间 Θ(|V|),因为我们必须扫描数组以找到最小值(这是一个低效的实现优先队列)。
总共,每个边在每个方向上被访问一次(因此Θ(|E|),每个|V| 迭代对数组进行 Θ(|V|) 扫描。
请注意,对于您在问题中的表达,V^2+V+2E+E,重要的是要记住上下文是对增长顺序的考虑。因此 2E 没有太大意义(2 代表什么?在边上迭代两次?每个边的 CPU 指令数?)或者 2E + E。这些只是模糊的 shorthand 符号,有时用于指示算法的各个阶段。
使用数组和邻接表的Prims算法的复杂度为:
V^2 + V + 2E + E = O(V^2)
但是,我不记得为什么 E
。
使用邻接表结构表示图和使用数组表示优先级队列的复杂度为Θ(|V|2 + |E| )。对于没有平行边的图,这是 Θ(|V|2).
Prim 的算法在 |V| 次迭代中运行,生成一棵从大小 1 开始到大小 |V| 结束的树。说在一些迭代中,顶点 v 被添加到树中,并且 lete E(v) 是从 v 发出的边。对于每条这样的边,我们可以找到数组中的邻居,并更新从当前树中某个顶点到它的最轻距离。找到顶点 v 需要时间 Θ(|V|),因为我们必须扫描数组以找到最小值(这是一个低效的实现优先队列)。
总共,每个边在每个方向上被访问一次(因此Θ(|E|),每个|V| 迭代对数组进行 Θ(|V|) 扫描。
请注意,对于您在问题中的表达,V^2+V+2E+E,重要的是要记住上下文是对增长顺序的考虑。因此 2E 没有太大意义(2 代表什么?在边上迭代两次?每个边的 CPU 指令数?)或者 2E + E。这些只是模糊的 shorthand 符号,有时用于指示算法的各个阶段。