解决的问题:查询两个样本是否在同一个集合中,并且合并两个样本集合。是上述两个问题的复杂度都是O(1)
原理
检查的主旨在于看最头上是不是一个元素
合并的主旨在于改变少的头的指向
对n个节点设置n个对应的指针,初始化时每个指针指向自己。
检查两个元素是否属于一个集合:通过将两个原元素往上指到不能再往上,如果两个元素的头头不是一个元素那么这两个元素不属于同一个集合。
以现在的a,b为例:a往上到不能再往上是a,b往上到不能再往上是b;
合并两个元素所在集合:将两个元素往上到不能再往上,将元素个数少的头挂在元素个数多的头底下.
以当前情况为例,合并b所在集合和e所在集合 ,将少的顶部(e)挂在多的顶部(a)底下。
并查集的优化:
在查询往上找头时,以下图的从Y向上找a的过程为例。
再向上寻找的过程中,可以顺便将路过的各个节点改向直接指向a
这样做的目的在于后续进行向上找头时缩短时间。
代码实现时:
可以建立哈希表:
第一张是节点与它指向的父节点的hashmap
第二张:节点如果是头节点,那么它在哈希表里对应的值是该集合的大小。如果不是头节点,那么它对应的值是0.