如果已知边数,则创建最小生成树的时间复杂度

时间:2013-05-31 23:42:25

标签: algorithm big-o time-complexity graph-algorithm minimum-spanning-tree

假设连通图的边数已知并且每条边的权重不同,是否可以在线性时间内创建最小生成树?

要做到这一点,我们必须看看每一条边;并且在此循环期间可以不包含搜索,否则将导致至少n log n时间。如果不在循环中搜索,我不知道该怎么做。这意味着,不知何故,我们必须只查看每个边缘一次,并决定是否基于一些不涉及不断增长的数据结构的“静态”先前值来包含它。

那么..假设我们保留节点的端点,然后查看下一个节点,如果下一个节点具有与prev相同的顶点,则比较prev和当前节点的权重并保持较低的节点。如果当前节点的端点不等于prev,那么它位于不同的组件中...现在我被卡住了,因为我们无法创建一个哈希或数组来跟踪已经添加的组件节点,同时查看线性中的每个边缘时间。

我想到的另一种方法是找到最小重量的边缘;由于边缘权重不同,因此该边缘将是任何MST的一部分。然后..我被卡住了。因为我们不能在线性时间内对n - 1个边缘这样做。

任何提示?


修改

如果我们知道节点的数量,边的数量以及每个边缘权重是否相同,该怎么办?比方说,例如,有n个节点,n + 6个边缘?

然后我们只需要找到并删除正确的7条边正确吗?

4 个答案:

答案 0 :(得分:2)

据我所知,通过知道图中有多少条边并且它们是不同的,无法更快地计算MST。在最坏的情况下,您必须在找到最小成本边(必须在MST中)之前查看图中的每个边,在最坏的情况下需要Ω(m)时间。因此,我声称​​任何 MST算法在最坏的情况下必须花费Ω(m)时间。

但是,如果我们在最坏的情况下已经做了Ω(m)工作,我们可以对任何MST算法执行以下预处理步骤:

  1. 扫描边缘并计算出有多少。
  2. 为每个边缘权重添加epsilon值以确保边缘是唯一的。
  3. 这也可以在时间Ω(m)内完成。因此,如果有一种方法可以加速MST计算,知道边数和边缘成本是不同的,我们只需对任何当前的MST算法执行此预处理步骤,以尝试获得更快的性能。因为据我所知,没有MST算法实际上是出于性能原因而尝试这样做,我怀疑没有(已知的)方法可以基于这些额外的知识获得更快的MST算法。

    希望这有帮助!

答案 1 :(得分:2)

对于最小生成树,有一种着名的随机线性时间算法,其复杂度在边数上是线性的。请参阅Karger,Klein和Tarjan的“随机线性时间算法以查找最小生成树”。

本文的关键结果是它们的“采样引理” - 如果你以概率p独立地随机选择边缘的子集并找到该子图的最小生成树,那么只有| V | / p边缘优于连接其末端的树路径中的最差边缘。

正如templatetypedef所指出的,你无法击败线性时间。所有边缘权重都是不同的是一个简化分析的常见假设;如果有的话,它会使MST算法运行得慢一些。

答案 2 :(得分:1)

许多边缘(N)已知的事实不会以任何方式影响复杂性。 N仍然是一个有限但无界的变量,每个图形将具有不同的N.如果在N上设置上限,比如100万,则复杂度为O(100万log 100万)= O(1)。

每个边缘具有不同的权重这一事实也不会影响程序,因为它没有说明图形的结构。因此,关于当前案例的知识不能影响进一步处理,因为我们无法预测图表的结构在下一步中的样子。

答案 3 :(得分:0)

如果边的数量接近n,例如本例中的n-6(在编辑后),我们知道我们只需要删除7条边,因为每个生成树都只有n-1条边。 Cycle Property显示周期中最昂贵的边不属于任何最小生成树(假定所有边都不同),因此应将其删除。

现在,您可以简单地应用 BFS DFS 来识别周期并去除最昂贵的边缘。因此,总的来说,我们需要运行BFS 7次。这需要7*n时间,并且给我们带来O(n)的时间复杂度。同样,只有在边数接近节点数的情况下,这才成立。