Algorithm Krushkal&x27的修改;O(E)时间中的s算法

Algorithm Krushkal&x27的修改;O(E)时间中的s算法,algorithm,graph,kruskals-algorithm,Algorithm,Graph,Kruskals Algorithm,假设G=(V,E)的边在{1,2}中有权。修改Krushkal的算法,使其在O(E)时间内运行 我不熟悉这个算法。这其中的逻辑是什么 Kruskal的算法是: 创建一个森林F(一组树),其中图中的每个顶点都是一棵独立的树 创建包含图形中所有边的集合S 而S是非空的,F还没有生成 从S上移除重量最小的边缘 如果删除的边连接两棵不同的树,则将其添加到林F,将两棵树合并为一棵树 假设您使用的是,成本主要取决于维护集合S,允许最初保留所有边,然后找到剩余边中最轻的边。但是,如果所有边的权重都为1

假设G=(V,E)的边在{1,2}中有权。修改Krushkal的算法,使其在O(E)时间内运行

我不熟悉这个算法。这其中的逻辑是什么

Kruskal的算法是:

  • 创建一个森林F(一组树),其中图中的每个顶点都是一棵独立的树
  • 创建包含图形中所有边的集合S
  • 而S是非空的,F还没有生成
    • 从S上移除重量最小的边缘
    • 如果删除的边连接两棵不同的树,则将其添加到林F,将两棵树合并为一棵树

假设您使用的是,成本主要取决于维护集合S,允许最初保留所有边,然后找到剩余边中最轻的边。但是,如果所有边的权重都为1或2,则可以使用两个链表实现此操作,每个权重一个,每个操作将为O(1)。

[编辑:此算法生成最小生成林G,即la Kruskal。当G连接时,此林将是一棵树。]

在实践中,它使用的不相交集运算的逆阿克曼复杂性在我们的物理世界中可以描述的任何问题上都表现为O(1),但它们不是真正的O(1),因此整个算法不是真正的O(| E |)

尽管如此,如果输入是以边列表的形式给出的,或者如果孤立顶点的分数(或总数)是以某个常数为界的,那么就有一个O(| E |)算法,它实际上相当简单——尽管称之为“Kruskal的修改”是一个巨大的延伸,对于一个试图弄明白这是什么的人来说,这是非常令人困惑的。(请注意,如果我在这里的假设不成立——也就是说,如果输入不是作为边列表给出的,并且孤立顶点的分数没有界限——那么在最坏的情况下,没有算法可以在O(| E |)时间内查看所有输入数据:G可能根本没有边,并且有数十亿个孤立顶点。)

算法 其基本思想是重复使用DFS,仅使用具有最小权重的边(尚未考虑)来查找连接的组件,然后将这些组件折叠为单个顶点。该算法在O(k(| E |+| V |)时间内工作,其中k是输入图中不同边权重的数量——因此,只要上述关于输入的假设成立且k以常数为界(这里k0,设置E=E’,并从步骤1开始重新开始(或者等效地,递归求解E’,并将结果边列表附加到T)
  • 当我们到达这一点时,T是G的最小生成树

  • 每个步骤最多需要O(| E |)时间,整个算法最多运行k次,因此在一开始给出的假设下,整个算法是O(| E |)。可以实现一些实际的加速,例如使用桶排序最初按权重对边排序,以及(再次按桶排序)删除步骤5中生成的重复边。

    “您可以使用两个链表实现此功能”如何实现?您可以解释更多信息吗?每个操作都是O(1)“你是说不相交的集合数据结构中的操作吗?@AyushMishra我指的是集合/优先级队列操作。不相交的集合数据结构操作被认为是事实上的O(1).如何检查两个元素是否属于同一集合?如何合并两个现有集合?它们是否与使用路径压缩的原始算法相同,因为它不是O(1)@AyushMishra正如我之前所说,这部分是使用标准的不相交集数据结构完成的。顺便说一句,原始算法并不仅仅使用路径压缩,两种启发式(压缩+秩并)的组合确实被有效地认为是O(1)我认为这个答案有两个问题:1.正如你所指出的,将其视为对Kruskal的修改实际上是令人困惑的-这就是问题所要求的。2.根据你自己的严格标准,逆Ackermann不是O(1),它根本不能满足您所说的复杂性。许多步骤包含指针或算术运算,它们增长非常缓慢,但不是严格恒定的。抱歉,但您弄错了。单位成本RAM模型并不是由理论家设想的,他们猜测发明一个模型,其中指针和算术运算是eemed O(1)。这只是一种反映,对于实际尺寸,这些尺寸实际上是恒定的,因此通过输入尺寸的对数来计算成本是没有意义的根据这个原理,逆阿克曼当然也是常数,因为它增长较慢。相反,在逆阿克曼不是常数的任何模型下,你的答案也不是常数。@AmiTavory:我为snark道歉(后来有人删除了它,还有我的其他无snark评论)然而,这里错的是你。要说指针和算术运算是O(1),我只需要假设单位成本RAM模型,它(和所有模型一样)在某些方面是不现实的。你可以质疑这个模型对真实计算机的适用性/相关性,但不是我的复杂性主张…@AmiTavory:…相比之下,你认为O(invAck)=O(1)是一个更强有力的主张:O(invAck)!=O(1)是一个不依赖于任何特定计算模型选择的数学真理,如果你要否认它,你需要完全放弃大Oh框架。如果你仍然不相信,我鼓励你向一位受尊敬的CS培训同事询问这一区别。你发现了
    kruskals算法
    标签:为什么标题和问题的拼写是否不同?