在log * n时间内找到联合查找算法的根

时间:2017-02-03 14:49:48

标签: algorithm tree

我知道使用平衡树方法进行联合查找的基本方法,并且它声明有一种方法可以在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),出了什么问题?

1 个答案:

答案 0 :(得分:0)

引用的log *时间范围是union-find implementation摊销运行时间,具有逐个联合和路径压缩,因此它仅适用于平均足够多的操作。它实际上可以改进为逆Ackermann,它甚至小于log *。如您所见,每个操作的最坏情况时间是Theta(log n)。