Algorithm - 数据结构 - 并查集(UnionFind)
问题描述:
并查集是树形的数据结构
用于解决相交集合的合并和查询问题
并查集的相关函数
// 初始化 // 将每个元素都单独设置为一个集合 void InitSet(){ for(int i = 0; i < MAX; I ++){ set[i] = i; } } // 用于寻找此元素所在的集合的根 int FindRoot(int index){ // 若该元素不是根元素 // 则继续往父级元素查找 if(set[index] != index){ // 路径压缩 // 在查找的同时将元素的父级都指向根元素 set[index] = FindRoot(set[index]); } // 如果此元素的值等于自身 // 说明该元素就是其所在集合的根 return set[index]; } // 查找的非递归版本 int FindRoot(int index){ int temp = index; while(set[index] != index){ index = set[index]; } return index; } // 用于联合a和b为一个集合 void Merge(int a, int b){ int f1 = FindRoot(a); int f2 = FindRoot(b); if(f1 != f2){ set[f2] = f1; } }
实现方法
每个集合用一个有根树来表示
建立一个数组, 每个元素的值就是该下标所代表的父级元素.
优化
将深度小的树合并到深度大的树
路径压缩: 每次查找元素时将元素都直接指向其根元素. 另整个集合的高度趋向于1.