Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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 伪码联合查找算法_Algorithm_Pseudocode_Union Find - Fatal编程技术网

Algorithm 伪码联合查找算法

Algorithm 伪码联合查找算法,algorithm,pseudocode,union-find,Algorithm,Pseudocode,Union Find,我对联合查找算法不太了解 从概念上讲,我知道它是如何工作的。我知道如果两个项目属于不同的组,那么这两个组将合并为一个组。但是,在下面的伪代码中 if rank[xSet] < rank[ySet] 如果要主动修改集合中每个元素的集合所有权,那么联合步骤实际上需要O(max(#xset,#yset))时间。此外,您甚至可能不会查询刚刚修改了其集合所有权的元素,这将导致所有额外的时间都付诸东流 另一方面,如果只更新集合的父元素的所有权,那么这个步骤就是O(1)!由于没有修改所有单个图元,您

我对联合查找算法不太了解

从概念上讲,我知道它是如何工作的。我知道如果两个项目属于不同的组,那么这两个组将合并为一个组。但是,在下面的伪代码中

if rank[xSet] < rank[ySet]

如果要主动修改集合中每个元素的集合所有权,那么联合步骤实际上需要O(max(#xset,#yset))时间。此外,您甚至可能不会查询刚刚修改了其集合所有权的元素,这将导致所有额外的时间都付诸东流


另一方面,如果只更新集合的父元素的所有权,那么这个步骤就是O(1)!由于没有修改所有单个图元,您节省了大量时间。接下来,当您必须查找任何项目的所有权时,您将反复遍历父项,直到最终找到没有父项的元素,并且该项目的所有者是您最初查找的项目的所有者

这样,你就不会做任何不必要的工作



奖励:在遍历父元素的过程中,您可以返回并更正遇到的所有父元素的所有权,并将其集合所有权更新为最终值,以便下次不仅此步骤是O(1)但是许多其他查询的运行时间都减少了。

您应该检查find函数,它应该是递归的是这样的:if set[x]!=x然后set[x]=find(set[x])返回set[x];我真的不明白这是什么意思,我认为这叫做路径压缩或smth,比如
union
函数不需要更新
数组中的其他节点,因为
find
函数知道
数组不一定是最新的,所以它会(通常很短)搜索以查找集合的根节点,而不是返回元素的父节点。好的。我认为它所做的只是创建一个属于某个组的对象链,但每个对象都可以标记为不属于该组,而是链接到实际属于该组的对象。因此,遍历所有这些对象,直到找到一个实际来自该组的对象(设置[x]=x),并设置所有对象的组:设置[obj]=x。我是否正确?:)