先不介绍并查集的概念,先从它的应用说起吧,它有两个功能,第一就是判断给定的一个节点是否属于某一个集合,更确切的说是属于哪个集合。第二个功能就是合并两个集合。
给定一组数据,如:1, 2, 3, 4, 5, 6, 7, 8, 9,他们是一个大的集合,但是也可以将他们每一个数字看成一个独立的集合,然后我们通过合并来形成一个由他们所有组成的大集合。有的人很奇怪,他们已经是一个集合了,为什么还要重新把他们组织起来呢,而且如果要查找某一个元素我们直接遍历这个集合不就可以了吗,时间复杂度是线性的。熟悉并查集的人可能会马上说出:利用并查集的两种操作:并和查,我们就能够重新组织这些数字,当他们有一定的逻辑,在查找和合并的时候都能够在小于线性的时间内完成。用什么表示并查集呢,我们应用树的表示形式,但是我们不创建树的节点,而是应用一个parent数字来表示当前索引为index的元素的祖先是谁。
上述的例子: i = 1, 2, ..., 9, parent[i] = i, 说明对于拥有单个元素的集合来说,它的根就是它本身,接下来遍历一遍数组,建立并查集: