并查集

来源:互联网 发布:知乎 显微镜原理 编辑:程序博客网 时间:2024/06/05 14:37
1.并查集(动态连通性)
解决问题:无向图中是否存在一条路径,连接两个指定的对象。即,指定的两个对象是否位于同一个连通分量中。
(1).快速查找Quick Find
数据结构:一个大小为N的id数组,每一项的值代表id
初始操作:设置id数组的每一项都等于它的索引。
合并操作:.执行union(a, b)操作时,遍历数组,所有与第一个id相同的id全部置为第二个b的id
查找操作:通过查找两个对象的id是否一致确定是否存在连接
时间复杂度:合并操作:两次全部执行for循环---N²---平方量级太慢
查找操作:1
(2).快速合并Quick Union
数据结构:数组中的每一项值代表它在树中的父节点,根节点的数组值为它本身
初试操作:设置id数组的每一项都等于它的索引,表示根节点指向自己
合并操作:执行union(a, b)操作时,将a的节点的值改为b的节点
查找操作:通过查找两个对象的根节点是否相同确定是否存在连接。
时间复杂度:合并操作:N²
查找操作:N²
(3).快速合并的优化:加权快速合并Weighted quick-Union
不是一味合并,当大树小树合并时,小树的根节点作为大树的子节点,总是将小树放在下面,而不关注参数的顺序。
数据结构:两个数组,一个记录根节点,一个记录以该对象为根节点的树中的对象个数
合并操作:1.执行union(a, b)操作时,检查以a, b为根节点的树中的元素个数
2.小树往大树合并(大小指的是元素个数)
3.修改元素个数大的对象的元素个数数组
时间复杂度:与节点在树中的深度有关,上限为log2N
(4).路径压缩Quick Union with Path Compression
找根节点的算法中增加一行将树展平,每个节点直接作为根节点的子节点
id[i] = id[id[i]]
原创粉丝点击