算法1之并查集
并查集:即包含 合并集合
和 查找集合中的元素
两种操作的树型数据结构, 并
、查
、集
三个字已经涵盖了其功能。常常在使用中以森林来表示。
一、并查集思想
1.1 算法思想
如果将集合中的元素当成是树上的不同的节点,那么,判断两个元素是否属于同一个集合的问题,就变成了他们所在树的根是否为同一根的问题。
1.2 路径压缩
同一棵树存在不同的枝干,枝干上有不同层次的叶节点(即我们所说的元素)。为了查快查找某个叶子节点的根节点的速度,查找时将元素 x 到根节点 root 上的所有叶子节点的 Parent(父节点)设为根节点。称该优化的方法为路径压缩。
经过路径压缩优化后,平均复杂度可视为 Ackerman 函数的反函数,实际应用中可粗略认为其是一个常数。
1.3 问题描述
以亲戚为例,或许你不会知道,某个朋友是你的亲戚,他可能是你的曾祖父的外公的女婿的外甥女的表姐的孙子。
通过家族图谱,可以很轻松判断两个人是否为亲戚。但当两个人的最近公共祖先与他们相隔好几代,使得家族十分庞大,那么检验两人的亲戚关系就会变得很困难。通过写程序推出 Marry 和 Ben 是否为亲戚。
说明: 这是一个非常经典的并查集例子。用集合的思路,对每个人建立一个集合,开始的时候集合元素就是这个人本身,表示开