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.

 

posted @ 2016-12-23 15:03  `Laimic  阅读(126)  评论(0)    收藏  举报