• 并查集的学习


    并查集是一种树型的数据结构,并查集可以高效地进行如下操作:

    1、查询元素p和元素q是否属于同一组

    2、合并元素p和元素q所在地组

     并查集结构:

    是一种树型结构,这棵树地要求比较简单

    1、每个元素都唯一对应一个节点

    2、每一组数据中地多个元素都在同一棵树内

    3、一个组中的数据对应的树和另外一个组中的数据对应的树之间没有任何联系

    4、元素在树中没有子父级关系的硬性要求

     并查集的查找思路:

    在数组中寻找,根据下标找到对应的元素,该元素如若不等于下标,则为该下标的父节点。当下标值等于对应下标元素的值,便是找到所要查找元素分组的标识符,思路图如下所示

     并查集的合并思路:

    找到p,q的根节点,让p所在树的根节点的父节点为q的根节点即可:

     并查集的路径压缩优化(以上方法可能会生成线性树,使得查找的最大时间复杂度为On),为了降低查找的时间复杂度,

    提高find的效率,我们可以在合并的时候,将小树合并到大树中,最大程度降低树的深度。

     

     最终并查集的代码结构如下所示

    1. public class UF{
    2. //记录节点元素和该元素所在分组的标识
    3. private int[] eleAndGroup;
    4. //记录并查集中数据的分组个数
    5. private int count;
    6. //用来存储每一个根节点对应树中保存的节点的个数
    7. private int[]sz;
    8. //初始化并查集
    9. public UF(int N){
    10. this.count=N;
    11. this.eleAndGroup=new int[N];
    12. for (int i = 0; i < eleAndGroup.length; i++) {
    13. eleAndGroup[i]=i;
    14. }
    15. this.sz=new int[N];
    16. //默认情况下,sz每个索引处的值都是1
    17. for(int i=0;i
    18. sz[i]=1;
    19. }
    20. }
    21. //获取当前并查集中的数据有多少个分组
    22. public int count(){
    23. return count;
    24. }
    25. //元素p所在分组的标识符
    26. public int find(int p){
    27. while (true){
    28. if(p==eleAndGroup[p]){
    29. return p;
    30. }
    31. p=eleAndGroup[p];
    32. }
    33. }
    34. //判断并查集中元素p和元素q是否在同一分组中
    35. public boolean connected(int p,int q){
    36. return find(p)==find(q);
    37. }
    38. //把p元素所在分组和q元素所在分组合并
    39. public void union(int p,int q){
    40. int proot=find(p);
    41. int qroot=find(q);
    42. //判断p和q是否已经在同一分组中
    43. if(proot==qroot){
    44. return;
    45. }
    46. //比较两棵树的大小
    47. if(sz[proot]
    48. eleAndGroup[proot]=qroot;
    49. sz[qroot]+=sz[proot];
    50. }
    51. else {
    52. eleAndGroup[qroot]=proot;
    53. sz[proot]=sz[qroot];
    54. }
    55. //分组个数减1
    56. this.count--;
    57. }
    58. }

  • 相关阅读:
    MySQL数据库—创建数据库与数据表
    WPF动画详解
    一键智能视频语音转文本——基于PaddlePaddle语音识别与Python轻松提取视频语音并生成文案
    【智慧燃气】智慧燃气解决方案总体概述--终端层、网络层
    Dubbo笔记
    3D激光SLAM:ALOAM---后端lasermapping 里程计到地图位姿更新维护
    C++ - 类型转换 - static_cast - reinterpret_cast - const_cast - dynamic_cast
    Docker:docker部署Nacos
    软文推广中媒体矩阵的优势在哪儿
    如何保证redis和数据库的一致性
  • 原文地址:https://blog.csdn.net/WC949464367/article/details/128005604