Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 为什么执行n个联合查找(按大小联合)操作的时间复杂度为O(n log n)?_Algorithm_Time Complexity_Graph Theory_Graph Algorithm_Union Find - Fatal编程技术网

Algorithm 为什么执行n个联合查找(按大小联合)操作的时间复杂度为O(n log n)?

Algorithm 为什么执行n个联合查找(按大小联合)操作的时间复杂度为O(n log n)?,algorithm,time-complexity,graph-theory,graph-algorithm,union-find,Algorithm,Time Complexity,Graph Theory,Graph Algorithm,Union Find,在基于树的联合查找操作实现中,每个元素都存储在一个节点中,该节点包含指向集合名称的指针。集指针指向v的节点v也是集名称。每个集合都是一棵树,根在具有自引用集合指针的节点上 要执行并集,我们只需使一棵树的根指向另一棵树的根。为了执行查找,我们从起始节点开始跟踪集合名称指针,直到到达集合名称指针指向自身的节点为止 在Union by size->执行联合时,我们将生成较小树的根 指向较大的根。这意味着O(n logn)时间 正在执行联合查找操作。每次我们跟随一个指针,我们都会指向一个子树,其大小最多

在基于树的联合查找操作实现中,每个元素都存储在一个节点中,该节点包含指向集合名称的指针。集指针指向v的节点v也是集名称。每个集合都是一棵树,根在具有自引用集合指针的节点上

要执行并集,我们只需使一棵树的根指向另一棵树的根。为了执行查找,我们从起始节点开始跟踪集合名称指针,直到到达集合名称指针指向自身的节点为止

在Union by size->执行联合时,我们将生成较小树的根 指向较大的根。这意味着O(n logn)时间 正在执行联合查找操作。每次我们跟随一个指针,我们都会指向一个子树,其大小最多是前一个子树的两倍。因此,对于任何查找,我们最多只遵循O(logn)指针


我不明白对于每个联合操作,查找操作总是O(logn)。有人能解释一下最坏情况的复杂性是如何计算的吗

现在让我们假设每个高度为h的树至少包含2^h个节点。如果你把两棵这样的树连在一起会发生什么

如果它们的大小不同,则组合树的高度与较高树的高度相同,因此新树仍有2^h以上的节点(相同高度但节点更多)

现在,如果它们的高度相同,则生成的树的高度将增加1,并且将至少包含2^h+2^h=2^(h+1)个节点。因此,这种情况仍然存在

最基本的树(1个节点,高度0)也满足该条件。因此,所有可以通过连接两棵树来构建的树也可以实现它

现在,高度只是在查找过程中要遵循的最大步数。如果一棵树有n个节点和高度h(n>=2^h),这将立即给出log2(n)>=h>=步数。

您可以执行n个联合查找(按秩或大小联合)操作,其复杂性O(n lg*n)其中lg*n是最常用的

请注意,O(nlg*n)比O(nlogn)


在这个问题中,你可以找到这个关系的细节。

我们需要证明树的最大高度是log(N),其中N是UF
(1)

在基本情况下,所有树的高度都为0<代码>(1)当然满意

现在假设所有树都满足(1),我们需要证明将任意2棵树与i,j(i)连接
max(log(j), 1 + log(i)) = max(log(j), log(2i)) <= log(i + j) => (2) proved