【问题标题】:Which one is better O(V+E) or O(ElogE)?O(V+E) 和 O(ElogE) 哪个更好?
【发布时间】:2018-05-01 16:47:20
【问题描述】:

我正在尝试开发一种能够从图中找到最小生成树的算法。我知道已经有很多现有的算法。但是我试图消除 Kruskal 算法中所需的边排序。到目前为止,我开发的算法有一部分需要计算不相交的集合,我需要一种有效的方法。经过大量研究,我知道唯一可能的方法是使用复杂度为 O 的 BFS 或 DFS (V+E),而 Kruskal 算法的复杂度为 O(ElogE)。现在我的问题是,O(V+E) 还是 O(ElogE) 哪个更好?

【问题讨论】:

  • 假设没有环,V 可以用E 表示,使用欧拉公式。因此O(V+E) 实际上只是O(E)。由于O(n) < O(nlogn)O(E + V) ~= O(E) < O(ElogE) 。我不确定我的数学,所以将其发布为评论而不是答案
  • @Srini 您不能假设没有循环,因为问题是关于计算图的最小生成树(因此是无向的并且具有潜在的非平凡循环)。然而,假设有一棵树可以找到,我们可以安全地假设V <= E
  • @Rerito 好点,我忽略了循环方面,因为我不确定如何处理欧拉平面图公式的V - E + F = 2F 组件。但我想如果 OP 或其他人能够弄清楚如何处理这个问题或证明 V 仍然与 E 共享线性关系,那么我想他们仍然可以建立在这个论点上
  • 并行运行两种算法并在一个完成后立即停止会给您带来复杂性O(min(V+E, E Log E)),这始终是最好的。

标签: algorithm time-complexity graph-theory breadth-first-search kruskals-algorithm


【解决方案1】:

一般来说,E = O(V^2),但对于所有图来说,这个界限可能并不紧密。特别是在稀疏图中,E = O(V),但对于算法复杂度通常表示为最坏情况值。

O(V + E) 是一种表示复杂性取决于有多少边的方式。在稀疏图中O(V + E) = O(V + V) = O(V),而在密集图中O(V + E) = O(V + V^2) = O(V^2)

另一种看待它的方式是,在大 O 表示法中,O(X + Y)O(max(X, Y)) 的含义相同。

请注意,这仅在 VE 可能具有相同幅度时才有用。对于 Kruskal 算法,主要因素是您需要对边列表进行排序。无论你有一个稀疏图还是密集图,这一步都支配着任何可能是O(V) 的东西,所以人们只需写O(E lg E) 而不是O(V + E lg E)

【讨论】:

  • 您能介绍一下 O(ElogE) 吗?
  • Kruskal 的算法涉及对边列表进行排序,因此无论您有一个稀疏图还是密集图,这将主导简单地迭代无序列表的成本。 “加法”术语 V 在任何一种情况下都无关紧要,所以只写 O(E lg E) 而不是 O(V + E lg E)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 2012-05-09
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
相关资源
最近更新 更多