数据结构与算法分析(Java语言描述)(21)—— 并查集基础
来源:互联网 发布:淘宝避开同款教程 编辑:程序博客网 时间:2024/06/05 12:42
package com.dataStructure.union_find;public class UnionFind1 { // 第一版的 Union-Find 本质是一个数组 private int[] id; // 数据个数 private int count; public UnionFind1(int n) { count = n; id = new int[n]; // 初始化,使每一个 id[i] 指向自己,没有合并的元素 for (int i = 0; i < n; i++) { id[i] = i; } } // 查找过程,查找元素 p 所对应的集合编号 // 复杂度 O(1) public int find(int p) { return id[p]; } // 查看元素 p 和 元素 q 是否属于同一个集合 // 复杂度 O(1) public boolean isConnected(int p, int q) { return find(p) == find(q); } // 合并元素 p 和元素 q 所属的集合 // 复杂度 O(n) public void unionElements(int p, int q) { int pID = find(p); int qID = find(q); if (pID == qID) return; // 合并过程需要遍历一遍所有元素, 将两个元素的所属集合编号合并 for (int i = 0; i < count; i++) { if (id[i] == pID) id[i] = qID; } }}
测试
// 测试第一版本的并查集, 测试元素个数为n private static void testUnionFind1(int n) { UnionFind1 unionFind1 = new UnionFind1(n); long startTime = System.currentTimeMillis(); // 进行 n 次操作,每次随机选择两个元素进行合并操作 for (int i = 0; i < n; i++) { int a = (int) (Math.random() * n); int b = (int) (Math.random() * n); unionFind1.unionElements(a, b); } // 再进行n次操作, 每次随机选择两个元素, 查询他们是否同属一个集合 for (int i = 0; i < n; i++) { int a = (int) (Math.random() * n); int b = (int) (Math.random() * n); unionFind1.isConnected(a, b); } long endTime = System.currentTimeMillis(); // 打印输出对这2n个操作的耗时 System.out.println("UnionFind_1 " + 2 * n + " ops, " + (endTime - startTime) + " ms "); }
阅读全文
0 0
- 数据结构与算法分析(Java语言描述)(21)—— 并查集基础
- 数据结构与算法分析(Java语言描述)(22)—— 并查集 Quick-Find
- 数据结构与算法分析(Java语言描述)(24)—— 并查集的路径压缩
- 数据结构与算法分析(Java语言描述)(23)—— 并查集基于 size 和 rank 的优化
- 数据结构与算法分析(Java语言描述)(16)—— 二叉搜索树基础、节点插入、查找
- 读书笔记:数据结构与算法分析(Java语言描述)——数据结构概论
- 数据结构与算法分析——Java语言描述
- 《数据结构与算法分析—Java语言描述》pdf
- 数据结构与算法分析(Java语言描述)(8)—— (随机)快速排序
- 数据结构与算法分析(Java语言描述)(9)—— (双轴)快速排序
- 数据结构与算法分析(Java语言描述)(1)—— 选择排序
- 数据结构与算法分析(Java语言描述)(2)—— 插入排序
- 数据结构与算法分析(Java语言描述)(3)—— 冒泡排序
- 数据结构与算法分析(Java语言描述)(4)—— 希尔排序
- 数据结构与算法分析(Java语言描述)(5)—— 归并排序
- 数据结构与算法分析(Java语言描述)(7)—— 快速排序
- 数据结构与算法分析(Java语言描述)(13)—— 原地堆排序
- 数据结构与算法分析(Java语言描述)(14)—— 索引堆
- JavaScript事件
- JAVA_三大排序_选择冒泡插入
- Bootstrap Table 中文文档(完整翻译版)
- 11月15日云栖精选夜读:分布式服务框架Dubbo疯狂更新!阿里开源要搞大事情?
- hive字符串基础操作函数
- 数据结构与算法分析(Java语言描述)(21)—— 并查集基础
- app model下 build.gradle 修改一下就卡的不行解决办法
- 输出符合条件的指定行
- PAT
- 共轭方向法和共轭梯度法
- api文档的安装
- 天梯地图(30 分)
- Redis实现原理:数据同步机制分析
- dialog.show()异常