• 并查集小结(转)


    最近做了点并查集的题,感觉也挺简单的。下面对我这段时间关于并查集的学习,做一下小结。

    并查集的作用:并和查,即合并和查找,将一些集合合并,快速查找或判断某两个集合的关系,或某元素与集合的关系,或某两个元素的关系。

    并查集的结构:并查集主要操作对象是森林,树的结构赋予它独特的能力,对整个集合操作转换为对根节点(或称该集合的代表元素)的操作,一个集合里的元素关系不一定确定,但相对于根节点的关系很明了,这也是为了查找方便。

    并查集优化方法:按秩合并和路径压缩的配合使用,使得查找过程优化到极致。按秩合并,每次将深度小的树合并到深度大的树里面去,使得整棵树尽量矮;路径压缩,将当前节点到根节点路径上的所有点直接连到根节点上,使得每个点到根节点的距离更短,在下一次查找的时候更快。

    如何快速确定偏移量公式:

    例:现在要合并节点x,y, 找到根节点fx = Find(x); fy = Find(y);一般情况下,根节点的偏移量都保持为0, offset[foot] = 0;如果要使得x和y的偏移量为t,假设fx指向fy,则可以写出公式offset[x] + offset[fx] - offset[y] = t,则offset[fx] = (offset[y] + t - offset[x]) % n; 这个n即为总共有多少类,如:在poj1182 食物链中n = 3,,在poj2492 A Bug's Life中n = 2, 这样fx的偏移量就计算出来了,只需要改其中一个根节点的偏移量,这里是fx,因为假设是fx指向fy。

    非递归路劲压缩:

    View Code
     1 代码
     2 
     3 int Find(int x){
     4     int r = x;
     5     while (r != bin[r]){
     6           r = bin[r];
     7     }
     8     int y = x;
     9     while (y != bin[y]){
    10           y = bin[y];
    11           bin[y] = r;
    12     }
    13     return r;    
    14 }

    递归式路径压缩:

    int Find(int x){
    if (x != bin[x]){
    return bin[x] = Find(bin[x]);
    }
    return x;
    }
  • 相关阅读:
    阿里云播放器弹幕选型
    使用swiper组件,轮播图在高分辨率情况下变形,图片拉高该如何解决?
    解决图片无法设置hover,以设置图片的阴影
    当标题文字超出长度后,后续用...来代替
    windows 安装wget
    【Go学习】GO中...的用法
    【Go】go test
    tcpdump工具及使用介绍
    leetcode32.最长有效括号
    Global Round 21 部分题解
  • 原文地址:https://www.cnblogs.com/0803yijia/p/2622171.html
Copyright © 2020-2023  润新知