当前位置: 首页 > news >正文

并查集 UnionFind Test01

1.   是什么?
一种很不一样的树形结构

  •  一般的结构是父亲指向孩子(比如说二叉树);
  •  而并查集是孩子指向父亲

2. 解决什么问题? 主要来解决连接问题

*接口定义*

 public interface UF {int getSize();boolean isConnected(int p, int q);void unionElements(int p, int q);}

6个版本实现并查集

 public class UnionFind1 implements UF {private int[] id;public UnionFind1(int size) {id = new int[size];for (int i = 0; i < size; i++) {id[i] = i;}}@Overridepublic int getSize() {return id.length;}private int find(int p) {return id[p];}public boolean isConnected(int p, int q) {return find(p) == find(q);}@Overridepublic void unionElements(int p, int q) {int pId = find(p);int qId = find(q);if (pId == qId) {return;}for (int i = 0; i < id.length; i++) {if (id[i] == pId) {id[i] = qId;}}}}
*quick union *`` public class UnionFind2 implements UF {
`` 
``     private int[] parent;
`` 
``     public UnionFind2(int size) {
``         parent = new int[size];
``         for (int i = 0; i < size; i++) {
``             parent[i] = i;
``         }
``     }
`` 
``     @Override
``     public int getSize() {
``         return parent.length;
``     }
`` 
``     private int find(int p) {
`` 
``         while (p != parent[p]) {
``             p = parent[p];
``         }
``         return p;
``     }
`` 
``     @Override
``     public boolean isConnected(int p, int q) {
``         return find(p) == find(q);
``     }
`` 
``     @Override
``     public void unionElements(int p, int q) {
`` 
``         int pRoot = find(p);
``         int qRoot = find(q);
``         if (qRoot == pRoot) {
``             return;
``         }
``         parent[pRoot] = qRoot;
``     }
`` }*quick union 基于size的优化*`` public class UnionFind3 implements UF {
`` 
``     //基于size的优化
``     private int[] parent;
`` 
``     private int[] sz;
`` 
``     public UnionFind3(int size) {
``         parent = new int[size];
``         sz = new int[size];
``         for (int i = 0; i < size; i++) {
``             parent[i] = i;
``             sz[i] = 1;
``         }
``     }
`` 
``     @Override
``     public int getSize() {
``         return parent.length;
``     }
`` 
``     private int find(int p) {
`` 
``         while (p != parent[p]) {
``             p = parent[p];
``         }
``         return p;
``     }
`` 
``     @Override
``     public boolean isConnected(int p, int q) {
``         return find(p) == find(q);
``     }
`` 
``     @Override
``     public void unionElements(int p, int q) {
`` 
``         int pRoot = find(p);
``         int qRoot = find(q);
``         if (qRoot == pRoot) {
``             return;
``         }
``         if (sz[qRoot] > sz[pRoot]) {
``             parent[pRoot] = qRoot;
``             sz[qRoot] += sz[pRoot];
``         }else {
``             parent[qRoot] = pRoot;
``             sz[pRoot] += sz[qRoot];
``         }
`` 
``     }
`` }*quick union 基于rank 的优化*`` public class UnionFind4 implements UF {
`` 
``     //基于rank的优化
``     private int[] parent;
`` 
``     private int[] rank;
`` 
``     public UnionFind4(int size) {
``         parent = new int[size];
``         rank = new int[size];
``         for (int i = 0; i < size; i++) {
``             parent[i] = i;
``             rank[i] = 1;
``         }
``     }
`` 
``     @Override
``     public int getSize() {
``         return parent.length;
``     }
`` 
``     private int find(int p) {
`` 
``         while (p != parent[p]) {
``             p = parent[p];
``         }
``         return p;
``     }
`` 
``     @Override
``     public boolean isConnected(int p, int q) {
``         return find(p) == find(q);
``     }
`` 
``     @Override
``     public void unionElements(int p, int q) {
`` 
``         int pRoot = find(p);
``         int qRoot = find(q);
``         if (qRoot == pRoot) {
``             return;
``         }
``         if (rank[qRoot] > rank[pRoot]) {
``             parent[pRoot] = qRoot;
``         } else if (rank[qRoot] < rank[pRoot]) {
``             parent[qRoot] = pRoot;
``         }else {
``             parent[pRoot] = qRoot;
``             rank[qRoot]++;
``         }
`` 
``     }
`` }*quick union 路径压缩版本1*`` public class UnionFind5 implements UF {
`` 
``     //基于路径压缩的优化 ->我们希望树的结构越简单越好,越扁平越好
``     //在find的时候进行压缩操作
``     private int[] parent;
`` 
``     private int[] rank;
`` 
``     public UnionFind5(int size) {
``         parent = new int[size];
``         rank = new int[size];
``         for (int i = 0; i < size; i++) {
``             parent[i] = i;
``             rank[i] = 1;
``         }
``     }
`` 
``     @Override
``     public int getSize() {
``         return parent.length;
``     }
`` 
``     private int find(int p) {
`` 
``         while (p != parent[p]) {
``             parent[p] = parent[parent[p]];
``             p = parent[p];
``         }
``         return p;
``     }
`` 
``     @Override
``     public boolean isConnected(int p, int q) {
``         return find(p) == find(q);
``     }
`` 
``     @Override
``     public void unionElements(int p, int q) {
`` 
``         int pRoot = find(p);
``         int qRoot = find(q);
``         if (qRoot == pRoot) {
``             return;
``         }
``         if (rank[qRoot] > rank[pRoot]) {
``             parent[pRoot] = qRoot;
``         } else if (rank[qRoot] < rank[pRoot]) {
``             parent[qRoot] = pRoot;
``         }else {
``             parent[pRoot] = qRoot;
``             rank[qRoot]++;
``         }
`` 
``     }
`` }*quick union 路径压缩版本2*`` public class UnionFind6 implements UF {
`` 
``     //基于路径压缩的优化 ->我们希望树的结构越简单越好,越扁平越好
``     //在find的时候进行压缩操作
``     private int[] parent;
`` 
``     private int[] rank;
`` 
``     public UnionFind6(int size) {
``         parent = new int[size];
``         rank = new int[size];
``         for (int i = 0; i < size; i++) {
``             parent[i] = i;
``             rank[i] = 1;
``         }
``     }
`` 
``     @Override
``     public int getSize() {
``         return parent.length;
``     }
`` 
``     private int find(int p) {
`` 
``         if (p != parent[p]) {
``             parent[p] = find(parent[p]);
``         }
``         return parent[p];
``     }
`` 
``     @Override
``     public boolean isConnected(int p, int q) {
``         return find(p) == find(q);
``     }
`` 
``     @Override
``     public void unionElements(int p, int q) {
`` 
``         int pRoot = find(p);
``         int qRoot = find(q);
``         if (qRoot == pRoot) {
``             return;
``         }
``         if (rank[qRoot] > rank[pRoot]) {
``             parent[pRoot] = qRoot;
``         } else if (rank[qRoot] < rank[pRoot]) {
``             parent[qRoot] = pRoot;
``         }else {
``             parent[pRoot] = qRoot;
``             rank[qRoot]++;
``         }
`` 
``     }
`` }

http://www.dtcms.com/a/276909.html

相关文章:

  • 字符串问题(哈希表解决)
  • linux:进程详解(2)
  • Java结构型模式---享元模式
  • 代码随想录|图论|14有向图的完全可达性
  • JavaScript加强篇——第八章 高效渲染与正则表达式
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ToastNotification(推送通知)
  • C++进阶-多态2
  • 学习python调用WebApi的基本用法(2)
  • iw 命令 -- linux 无线管理
  • 利用 MySQL 进行数据清洗
  • C++类和对象(一)
  • Intel英特尔ICH7R/ICH8R/ICH9R/ICH10R系列下载地址--intel_msm_8961002 下载 Version 8.9.6.1002
  • 001_Claude开发者指南介绍
  • UNet改进(22):融合CNN与Transformer的医学图像分割新架构
  • MaxCompute过程中常见的数据倾斜场景以及对应的解决方案
  • std::sort的核心设计思想
  • C++:宏
  • python暑假课第三次作业
  • 从爆红到跑路:AI明星Manus为何仅用四个月就“抛弃”了中国?
  • 详解缓存淘汰策略:LFU
  • macOS - Chrome 关闭自动更新
  • 12.1 MMU配置与管理
  • 人工智能之数学基础:神经网络的矩阵参数求导
  • 基于CMMI的软件质量管理体系深度解析
  • 初级网安作业笔记1
  • 2025上海市“星光计划“信息安全管理与评估赛项二三阶段任务书
  • 【leetcode】字符串,链表的进位加法与乘法
  • 贝叶斯状态空间神经网络:融合概率推理和状态空间实现高精度预测和可解释性
  • 新手向:使用Python构建高效的日志处理系统
  • Linux系统之iprdbg 命令详解