并查集
并查集是一种树型的数据结构,用于处理一些不交集的合并及查询问题
并查集主要包含以下几种基本操作:
1、建立新的并查集
2、把元素x和元素y所在的集合合并,要求x和y所在的集合不相交,如果相交则不合并
3、找到元素x所在的集合的代表,该操作也可以用于判断两个元素是否位于同一个集合,只要将它们各自的代表比较一下就可以了
看不懂?如图所示:比如说找D和E是不是存在于一个集合中:从D、E上溯到顶。发现都属于A,则存在于一个集合中。
将A、H集合合并:
但是并查集也有两种优化措施:按秩合并与路径压缩。
按秩合并
按秩合并是指总是将更小的树连接至更大的树上。因为影响执行效率的是树的秩(深度),更小的树添加到更深的树的根上将不会增加秩除非它们的秩相同。当两棵秩同为r的树联合时,它们的秩r+1
路径压缩
路径压缩就是指:在Find过程中,递归改变每个节点的根结点,使得该节点指向最终节点。
这样以后查询就方便多了。
//在路径上的每个元素都直接指向根元素
public int find(Node p) {
if (p == p.next)
return p;//找到自己了,返回头结点
p.next = find(p.next);
//在路径上的所有p 都会找到p.parents
return p;
}
当然也可以用map来表示。