[Algorithm] 并查集
背景QAQ
最近在准备找工作,以前就听说过并查集,一直没有深入了解,今天就仔细分析一下并查集,如果有漏洞请多多指教
概念
并查集就是一种树形结构,主要是用来处理一些不相交集合的合并及查询问题。
那么是怎么处理的呢。
首先要求集合中的元素不相同,其次要求可以识别出某个集合。这就需要我们找出一个集合中的某个元素作为特征值来代表这个集合。
试想类似于武林门派。把集合类似于不同门派。比如少林、武当、峨眉等。然后把各门派的掌门人作为该门派的代表人物。这样就很像并查集的集合概念了
并查集要做的就是合并和查询。
合并join:
现在要求两个集合合并,类似于武当和峨眉结盟,那么就需要在这两个门派中推选出新的盟主来代表这个大联盟。
在集合中呢,就要通过把两个特征值合并来组成一个门派。因为并查集是一个树结构,所有可以通过使A集合特征值称为B集合子节点来完成合并。
查询find:
查询是通过每个子节点都有一个指向父节点的指针来联系在一起。所以这很容易实现。
代码实现(使用数组来模拟):
int pre[N] // 表示N节点的父节点值情况 int find(x) { int r = x; while (pre[r] != r) r = pre[r[; return r; }
void join(int x, int y) { int a = find(x); int b = find(y); if (a != b) pre[a] = b; }