前言:
这一次为大家介绍的另外一种比较基础的算法——并查集Union-Find算法。这是一种用于不相交集(
Disjoint Sets)的查询以及合并问题的算法。主要用树的形式来进行链接,这里我们将使用的是数组来表现。
PS:不相交集是并查集的另一个说法~~
还是老样子,先是
GitHub传送门~~
原理:
首先我们要认识到并查集算法是用来处理不相交集问题的一个工具,它为等价关系的确定提供了很大的便利。
并查集中的Union可以将集合进行链接,使它们成为等价类;而Find可以查找集合的类别,从而直观的了解其等价关系。而我们对等价关系有严格的定义,先看看什么是等价关系吧。
等价关系:
等价关系 R 要求处于同一个等价类S中的任意元素a,b满足三点要求:
1.自反性,对于所有的a属于S,有aRa;
2.对称性,若aRb则有bRa;
3.传递性,若aRb,bRc,则有aRc;
这样似乎很模糊,对于没有学过离散数学的朋友来说等价的概念仍然不清楚,那我就举两个例子,第一个就是
“=”关系;这是一个最经典的等价关系它满足:自反性—— 1 = 1成立;对称性——若 a = b,则b = a;传递性——若a = b,b = c,那么a = c;不知道这样理解了吗?
如果还没有的话那就在举一个例子吧,有三个人分别是小A,小B和小C,现在有一个关系为“某人和某人是一个学院的”;现在我们就来判断这个关系是不是一个等价关系;首先我们来
判断自反性——小A和小A是一个学院的吗?答案显而易见,那么
自反性满足!接下来是
对称性判断——如果我们知道了小A和小B是一个学院的,那么小B和小A是一个学院的吗?肯定是的啊;最后就是
传递性判断了——若小A和小B一个学院,小B和小C一个学院那么我们也可以知道小A和小C一个学院!那么