假设连通图的边数已知并且每条边的权重不同,是否可以在线性时间内创建最小生成树?
要做到这一点,我们必须看看每一条边;并且在此循环期间可以不包含搜索,否则将导致至少n log n时间。如果不在循环中搜索,我不知道该怎么做。这意味着,不知何故,我们必须只查看每个边缘一次,并决定是否基于一些不涉及不断增长的数据结构的“静态”先前值来包含它。
那么..假设我们保留节点的端点,然后查看下一个节点,如果下一个节点具有与prev相同的顶点,则比较prev和当前节点的权重并保持较低的节点。如果当前节点的端点不等于prev,那么它位于不同的组件中...现在我被卡住了,因为我们无法创建一个哈希或数组来跟踪已经添加的组件节点,同时查看线性中的每个边缘时间。
我想到的另一种方法是找到最小重量的边缘;由于边缘权重不同,因此该边缘将是任何MST的一部分。然后..我被卡住了。因为我们不能在线性时间内对n - 1个边缘这样做。
任何提示?
修改
如果我们知道节点的数量,边的数量以及每个边缘权重是否相同,该怎么办?比方说,例如,有n个节点,n + 6个边缘?
然后我们只需要找到并删除正确的7条边正确吗?
答案 0 :(得分:2)
据我所知,通过知道图中有多少条边并且它们是不同的,无法更快地计算MST。在最坏的情况下,您必须在找到最小成本边(必须在MST中)之前查看图中的每个边,在最坏的情况下需要Ω(m)时间。因此,我声称任何 MST算法在最坏的情况下必须花费Ω(m)时间。
但是,如果我们在最坏的情况下已经做了Ω(m)工作,我们可以对任何MST算法执行以下预处理步骤:
这也可以在时间Ω(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)
的时间复杂度。同样,只有在边数接近节点数的情况下,这才成立。