使用“路径减半”的不相交集的Find操作

问题描述

根据Disjoint-set_data_structure中的“联合”部分,我在理解“路径减半”方法的实现时遇到了问题。

type HeaderStateMap = {
    user:any,hidden:boolean
};

const mapStatetoProps = ({ user: { user },cart: { hidden } }:HeaderStateMap) => {
    return {
        user,hidden
    };
};

我的第一个迭代看起来像这样:

enter image description here

第一次迭代后, function Find(x) while x.parent ≠ x x.parent := x.parent.parent x := x.parent return x x.parent指向同一节点(不应该发生)。我需要有关此函数正确流程和迭代的帮助

我对该函数的第3行和第4行感到困惑,并且还“路径减半使路径上的所有其他节点都指向其祖父母”。

任何帮助将不胜感激,谢谢!

解决方法

算法的工作原理如下:从节点x开始,使x指向其祖父母,然后继续到祖父母本身,继续直到找到根为止,因为根的父代就是根本身。 / p>

看看图片,您实际上是通过将集合转换为二叉树(不是适当的二叉树,但可以这样表示)来将其减半。

enter image description here

假设我们有这样的一套:

8->7->6->5->4->3->2->1->0

其中箭头表示父级(例如8->7 = 8的父级是7)

说我们叫Find(8)

第一次迭代:

x = 8
8.parent = 7

8.parent = 8.parent.parent = 7.parent = 6
x = 8.parent = 7.parent = 6

第二次迭代:

x = 6
6.parent = 5

6.parent = 6.parent.parent = 5.parent = 4
x = 6.parent = 5.parent = 4

以此类推...