Union-Find
Contents
一、Quick-Find
##算法思想
将相互连通的节点归类于集合里,每一个集合有自己的集合编号。用连续的数组来储存所有节点,数组的每个元素的内容为所属集合的集合编号(初始值为自己的index)。
每次连接(union)两个节点时,将其中一个节点所属的集合中的所有节点的集合号改为另一个节点的集合编号。
每次查询(find)两个节点是否已连接时,只需查看两个节点的集合编号是否一致。
##算法效率
find快,union慢。union访问数组次数为N,find访问数组次数为1
二、Quick-Union
算法思想
利用树结构,用连续数组储存所有的节点,每个数组元素的内容为该节点的父节点(初始值为自己的index)。所以树的root节点的父节点为自己。
Union:找到两个节点所在的树的root,并将其中一个节点的root改为另一个节点的root
Find:找到两个节点所在的树的root,并对比是否相同。(遍历本节点的父节点的,知道父节点的root与index相同)
算法效率
Union快,Find慢。union访问数组次数为N,find访问数组次数为N
三、Weighted quick-union
算法思想
在quick-union的基础上,改良union的操作。增加一个数组来记录所有节点所在树的深度。union两个节点的时候将树深度浅的节点树深度深的节点的root上,因此可以使形成的树深度较浅,从而减少find和union时遍历树的时间
算法效率
find和union都为lgN
四、Quick-Union+Path-Compression
算法思想
在quick-union的基础上,进行路径压缩,即在返回当前节点root函数中,添加id[i]=id[id[i]],将本节点的父节点改为本节点父节点的父节点,从而达到减小树深的作用。
五、Weighted quick-union+Path-Compression
算法思想
在Weighted quick-union的基础上,进行路径压缩。效率最高。