Algorithm 为什么用反阿克曼函数来描述Kruskal';s算法?

Algorithm 为什么用反阿克曼函数来描述Kruskal';s算法?,algorithm,complexity-theory,graph-theory,kruskals-algorithm,ackermann,Algorithm,Complexity Theory,Graph Theory,Kruskals Algorithm,Ackermann,在一个算法分析类中,我们展示了Kruskal算法的伪代码: 然后,对于不相交集林,他陈述了以下内容: m个生成集、并集和查找集操作的序列,其中n个 是生成集操作,可以在不相交的集合林上执行 在最坏情况下,通过秩和路径压缩联合O(mα(n)) 用于计算步骤2和步骤5-8的复杂性 对于连通G:| E |≥ |V |-1;m=O(V+E),n=O(V) 所以步骤2,5-8:O((V+E)α(V))=O(Eα(V)) α(V)=O(lgv)=O(lge);所以我们得到了O(E lge)-//这里α(V

在一个算法分析类中,我们展示了Kruskal算法的伪代码:

然后,对于不相交集林,他陈述了以下内容:

m个生成集、并集和查找集操作的序列,其中n个 是生成集操作,可以在不相交的集合林上执行 在最坏情况下,通过秩和路径压缩联合O(mα(n))

用于计算步骤2和步骤5-8的复杂性

对于连通G:| E |≥ |V |-1;m=O(V+E),n=O(V)

所以步骤2,5-8:O((V+E)α(V))=O(Eα(V))

α(V)=O(lgv)=O(lge);所以我们得到了O(E lge)-//这里α(V)如何相等?

Kruskal:步骤3、5-8和步骤4:O(E lge)

观察:| E |<|V | 2->lge=O(lgv)

那么,Kruskal复杂性:O(E lg V)

我试图理解这个“alpha(n)”/“α(n)”函数背后的逻辑,从我所读到的内容来看,简单地说,Ackermann函数是一个指数增长非常快的函数,而逆函数是一个对数增长非常慢的函数

如果我的解释是正确的,“α(n)”代表什么?这是否意味着组合操作最多为O(lg n)?如何/为什么需要使用反向阿克曼?我的印象是这个操作执行了V次(每个顶点)。在此之后,α(V)也被简化为O(lgv)=O(lge),这是否意味着,在最大情况下,α(V)可以用O(lgv)表示

还有,为什么会有这样的陈述,为什么会有这样的陈述呢

我想我的问题真的可以归结为,为什么不相交集的“森林”表示似乎比那些用链表实现的表示更有效,而我的讲师说它们都是O(E log V)?因此,用森林实现不相交集的难度增加了吗?

α(V)=O(lg V)是一种常见的符号滥用,实际上我们有α(V)∈ O(lgv)(V的逆阿克曼是函数集O(lgv)的一个成员)。它们不相等,甚至不是同一类型,一个是函数,另一个是函数集

怎么知道那个| E |<| V |²

一个完整的无向图有多少条边?你不能再有更多了。你可以在一个多重图中使用,但这不是算法的作用,把它扩展到多重图是没有用的——只需扔掉一对节点之间除了最佳边以外的所有边

为什么不相交集的“森林”表示似乎比使用链表实现的表示更有效,而我的讲师指出它们都是O(E log V)

出于几个原因,这是一个奇怪的问题。首先,通过Kruskals算法,而不是通过Kruskals算法,可以有效地测量不相交集的效率。“他们”是你的问题,是Kruskals算法的两个实现。第二,正如你肯定意识到的,上界的推导使用了α(V)∈ O(lgv)。因此,它故意忽略了一个显著的差异。这是有道理的,因为时间复杂度是由排序步骤渐进控制的,但仅仅因为在大O中看不到差异并不意味着它不存在

因此,在森林中实现不相交集的难度增加了吗

确实没有增加难度。这是一个超级简单的数据结构,您可以在5分钟内编写,仅仅两个数组和一些简单的代码链接列表实际上可能更难,特别是如果您必须进行手动内存管理的话。注意,在Kruskals算法的上下文之外,渐近时间和实际时间的差异是巨大的


但是,即使在Kruskals算法的上下文中,改进算法的第二阶段显然使总时间更好,即使它在最坏情况下不显示渐近时间。FWIW您也可以改进第一阶段,您可以使用堆(或其更高级的替代品之一),只在线性时间内堆化边缘。然后,算法的第二阶段将逐个提取它们,但至关重要的是,您通常不必提取每条边-您可以跟踪剩下的不相交集的数量,并在其降至1时停止,可能会留下许多(甚至大多数)未使用的边。在最坏的情况下,这是没有帮助的,但在现实生活中确实如此。在特殊情况下,当任何快速排序(计数排序、桶排序等)适用时,您可以比O(E log E)更快地对边进行排序。

为详细的答案干杯,哈罗德,并为我的各种问题干杯。