我知道使用平衡树方法进行联合查找的基本方法,并且它声明有一种方法可以在log * n方法中查找节点的根,根查找过程的代码是(直接从文章):
int root (int Arr[ ] ,int i)
{
while(Arr[ i ] != i)
{
Arr[ i ] = Arr[ Arr[ i ] ] ;
i = Arr[ i ];
}
return i;
}
此处Arr[j]
存储节点j
的父节点,我们需要找到节点i
的根,假设已经创建了树。但我无法证明其log*n
时间的复杂性。当我们遍历所有元素时,我们会检查祖父项,因此它的O(logn /2)
时间复杂度与O(log n)
相同,但文章指出其O(log* n)
,出了什么问题?
答案 0 :(得分:0)
引用的log *时间范围是union-find implementation的摊销运行时间,具有逐个联合和路径压缩,因此它仅适用于平均足够多的操作。它实际上可以改进为逆Ackermann,它甚至小于log *。如您所见,每个操作的最坏情况时间是Theta(log n)。