在算法分析类中,我们看到了 Kruskal 算法的伪代码:
然后,对于不相交的森林,他陈述了以下内容:
在最坏情况时间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(lg V) = O(lg E);所以我们得到 O(E lg E) ----- // 这里的 α(V) 怎么相等?
Kruskal:第 3、5-8 步和第 4 步:O(E lg E)
观察:|E| < |V|2 -> lg E = O(lg V)
所以,克鲁斯卡尔复杂度:O(E lg V)
我试图理解这个“alpha(n)”/“α(n)”函数背后的逻辑,从我所读到的内容来看,简单地说,Ackermann 函数是一个以令人难以置信的速度增长的函数,并且inverse 是一种以对数方式缓慢增长的方法。
如果我的解释是正确的,“α(n)”代表什么?这是否意味着 MAKE-SET 操作最多为 O(lg n)?如何/为什么需要使用逆阿克曼?我的印象是这个操作执行了 V 次(对于每个顶点)。在此之后,α(V) 也被简化为 O(lg V) = O(lg E),这是否意味着,α(V) 最多可以表示为 O(lg V)?
另外,为什么|E| < |V|^2 -> lg E = O(lg V)语句,怎么知道 |E| < |V|^2?
我认为我的问题真的归结为,为什么当我的讲师说它们都是 O(E log V) 时,不相交集的“森林”表示似乎比使用链表实现的那些更有效?因此,与森林实施不相交集的难度增加有什么意义吗?