Algorithm 如果边数已知,则创建最小生成树的时间复杂度
假设连通图的边数已知,且每条边的权重不同,那么是否有可能在线性时间内创建最小生成树 要做到这一点,我们必须审视每一个边缘;在这个循环中,不能包含任何搜索,否则它将导致至少n个logn次。我不知道如何在不搜索循环的情况下执行此操作。这意味着,不知何故,我们必须只看一次每一条边,并根据一些不涉及不断增长的数据结构的“静态”先前值来决定是否包含它 所以。。假设我们保留该节点的端点,然后查看下一个节点,如果下一个节点的顶点与prev相同,则比较prev和当前节点的权重,并保留较低的一个。如果当前节点的端点不等于prev,则它位于不同的组件中。。现在我被卡住了,因为我们无法创建哈希或数组来跟踪已经添加的组件节点,同时在线性时间内查看每条边 我想到的另一种方法是找到重量最小的边;由于边权重不同,因此此边将是任何MST的一部分。然后。。我被卡住了。因为我们不能在线性时间内对n-1条边这样做 有什么提示吗Algorithm 如果边数已知,则创建最小生成树的时间复杂度,algorithm,big-o,time-complexity,graph-algorithm,minimum-spanning-tree,Algorithm,Big O,Time Complexity,Graph Algorithm,Minimum Spanning Tree,假设连通图的边数已知,且每条边的权重不同,那么是否有可能在线性时间内创建最小生成树 要做到这一点,我们必须审视每一个边缘;在这个循环中,不能包含任何搜索,否则它将导致至少n个logn次。我不知道如何在不搜索循环的情况下执行此操作。这意味着,不知何故,我们必须只看一次每一条边,并根据一些不涉及不断增长的数据结构的“静态”先前值来决定是否包含它 所以。。假设我们保留该节点的端点,然后查看下一个节点,如果下一个节点的顶点与prev相同,则比较prev和当前节点的权重,并保留较低的一个。如果当前节点的端
编辑 如果我们知道节点的数量、边的数量以及每个边的权重是不同的,会怎么样?比如说,有n个节点,n+6条边
那么我们只需要找到并删除正确的7条边,对吗?据我所知,如果知道图中有多少条边并且它们是不同的,就无法更快地计算MST。在最坏的情况下,您必须查看图中的每条边,然后才能找到最小成本边(必须在MST中),在最坏的情况下,这需要Ω(m)时间。因此,我认为任何MST算法在最坏的情况下都必须花费Ω(m)时间 但是,如果我们已经在最坏的情况下进行Ω(m)工作,我们可以对任何MST算法执行以下预处理步骤:
希望这有帮助 已知多条边(N)的事实不会以任何方式影响复杂性。N仍然是一个有限但无界的变量,每个图都有不同的N。如果在N上放置一个上界,比如说一百万,那么复杂度是O(一百万对数一百万)=O(1)
每个边都有不同的权重这一事实也不会影响程序,因为它不会说明任何关于图形结构的信息。因此,关于当前情况的知识不会影响进一步的处理,因为我们无法预测下一步图的结构会是什么样子。有一个著名的最小生成树随机线性时间算法,其复杂性在边数上是线性的。参见Karger、Klein和Tarjan的“寻找最小生成树的随机线性时间算法” 本文的关键结果是他们的“抽样引理”——如果你独立地随机选择概率为p的边的子集,并找到这个子图的最小生成树,那么在连接其两端的树路径中,只有| V |/p边比最差边更好
正如templatetypedef所指出的,你无法超越线性时间。所有边权重都不同是简化分析的常见假设;如果有什么不同的话,它会使MST算法运行得稍微慢一点 如果边的数量接近n,如本例中的
n-6
(编辑后),我们知道我们只需要删除7条边,因为每个生成树只有n-1
边。
结果表明,循环中最昂贵的边不属于任何最小生成树(假设所有边都是不同的),因此应该删除
现在,您可以简单地应用BFS或DFS来识别一个周期并删除最昂贵的边缘。所以,总的来说,我们需要运行BFS 7次。这需要
7*n
时间,并使我们的时间复杂度为O(n)
。同样,只有当边的数量接近节点的数量时,这才是正确的。您的分析是正确的,但我们也有一个匹配的线性理论上限。我对你的评论感到有点困惑,你说“并没有任何MST算法会因为性能的原因而尝试这样做”,但是---你真的知道一个应用程序,在这个应用程序中,MST是计算出来的,并且人们非常关心MST代码的性能工程吗?