算法实践--不相交集合(Disjoint Sets)
什么是不相交集合(Disjoint Sets)
是这样的一组set,任何元素最多只能在一个set中
至少支持查找Find和合并Union操作

实现方式(基于树)
- 每个set都是一棵树
- 每棵树都由树的根节点识别

- 合并操作只需要修改根节点的指针

- 合并的复杂度是O(1)
- 查找的复杂度是O(depth) ,树的深度
- 可以方便地通过指针来实现
struct item {
char data;
Item* parent;
}
- 但是如果数据结构中没有指针,需要自己在外面再套一层结果,比较麻烦
- 还有另一种方法是通过hash表来实现,不需要指针
C++代码实现
class Disjoint_set {
unordered_map<char, char> PARENT;
unordered_map<char, int> RANK; //记录深度
public:
Disjoint_set() {
char universe[] ] {'a', 'b', 'c', 'd', 'e'};
for (char x : universe) {
PARENT[x] = x;
RANK[x] = ;
}
PARENT['d'] = 'b'; //d指向b,b和d在同一个集合
RANK['b']++;
}
char Find(char item) {
if (PARENT[item] == item)
return item;
else
Find(PARENT[item]);
}
// 查找的复杂度取决于树的深度,优化合并操作
void Union(char set_1, char set_2) { //谁深指向谁
if (RANK[set_1] > RANK[set_2])
PARENT[set_2] = set_1;
else if (RANK[set_2] > RANK[set_1])
PARENT[set_1] = set_2;
else {
PARENT[set_1] = set_2;
RANK[set_2]++;
}
}
};
int main() {
Disjoint_set ds;
ds.Find('c'); //返回c
ds.union('c', 'a'); //c指向a
ds.Find('c');|//返回a
ds.union('a', 'b');|//a指向b
}
算法实践--不相交集合(Disjoint Sets)的更多相关文章
- 并查集(不相交集合)详解与java实现
目录 认识并查集 并查集解析 基本思想 如何查看a,b是否在一个集合? a,b合并,究竟是a的祖先合并在b的祖先上,还是b的祖先合并在a上? 其他路径压缩? 代码实现 结语 @(文章目录) 认识并查集 ...
- python基础---集合类型(Sets)
集合类型(Sets) 集合对象是不同的(不可重复)hashable对象的无序集合.常见用法包括:成员关系测试.移除序列中的重复.以及科学计算,例如交集.并集.差分和对称差分.通俗点来说,集合是一个无序 ...
- 不相交集合ADT
不相交集合数据结构保持一组不相交的动态集合S={S1,S2,...,SK},每个集合通过一个代表来识别,代表即集合中的某个成员. 如果x表示一个对象,不相交集合支持以下操作: MAKE-SET(x): ...
- 算法实践——舞蹈链(Dancing Links)算法求解数独
在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dancing Links)算法求解精确覆盖问题. 本文介绍该算法的实际运用,利用舞蹈链(Dancin ...
- 算法实践--最小生成树(Kruskal算法)
什么是最小生成树(Minimum Spanning Tree) 每两个端点之间的边都有一个权重值,最小生成树是这些边的一个子集.这些边可以将所有端点连到一起,且总的权重最小 下图所示的例子,最小生成树 ...
- 4、2支持向量机SVM算法实践
支持向量机SVM算法实践 利用Python构建一个完整的SVM分类器,包含SVM分类器的训练和利用SVM分类器对未知数据的分类, 一.训练SVM模型 首先构建SVM模型相关的类 class SVM: ...
- 【并查集】 不相交集合 - 并查集 教程(文章作者:Slyar)
最近写了一个多星期的并查集,一瞬间贴出这么多解题报告,我想关于并查集的应用先告一段落吧,先总结一下. 在网上看到一篇关于并查集比较好的教程(姑且允许我这么说吧),不转过来是在可惜.献给爱学习的你 文章 ...
- Disjoint Sets
Disjoint Sets Disjoint Sets的意思是一堆集合們,它們相互之間都沒有交集.沒有交集是指:各個集合之間沒有擁有共同.相同的元素.中文稱作「分離集」. Disjoint Sets的 ...
- 转载 - 算法实践——舞蹈链(Dancing Links)算法求解数独
出处:http://www.cnblogs.com/grenet/p/3163550.html 在“跳跃的舞者,舞蹈链(Dancing Links)算法——求解精确覆盖问题”一文中介绍了舞蹈链(Dan ...
随机推荐
- laravel 路由的配置
- 『TensorFlow』张量拼接_调整维度_切片
1.tf.concat tf.concat的作用主要是将向量按指定维连起来,其余维度不变:而1.0版本以后,函数的用法变成: t1 = [[1, 2, 3], [4, 5, 6]] t2 = [[7, ...
- 修改PL/ORACLE字符编码集
一.pl/sql developer 中文字段显示乱码 原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的. 二.查看和修改oracle数据库字符集: select ...
- EBS 请求输出Html报表集成Echarts
百度开源的ECharts有样式丰富且美观的报表类型可供选用,可以将其集成至EBS请求输出的Html报表中,这其实就是一个生成Html数据的过程. 定义输出类型为HTML的请求我就不在此处赘述. 我 ...
- java子类继承父类的方法(代码简略版)
父类:public class Subjects { public void b() { System.out.println("学科"); } public void a(){ ...
- 聊一聊啥都不会的我自学Linux系统的历程
Linux大家都不陌生,我是在大三的时候开始接触Linux,上课的时候一位给我们上课的老师闲聊的时候说,你们计算机专业的学生要好好去学Linux,对于你们以后发展或者是就业都很有帮助. 开始的时候是一 ...
- 福大软工 · BETA 版冲刺前准备(团队)
BETA 版冲刺前准备 队名:第三视角 作业链接 组长博客 应作业要求为了更加顺利地开展beta版本的冲刺,上次的alpha版本展示后,我们组对之前开发过程中存在的各种问题进行了全面的讨论,并对其进行 ...
- leetcode python 008
## 字符串转化为整数## 懒得自己做int0=63435435print(int(int0))
- Opencv undefined reference to `cv::imread() Ubuntu编译
Ubuntu下编译一个C++文件,C++源程序中使用了opencv,opencv的安装没有问题,但是在编译的过程中出现如下错误: undefined reference to `cv::imread( ...
- 2017-9-3模拟赛T2 取数(win)
题目 题解 做法1: 直接暴力枚举每个数是否被选出,计算平均数-中位数,并与当前答案进行比较.复杂度O(2^n),能过60%的数据. 做法2: 将每个数排序后枚举中位数. 首先,取奇数个数一定更优.容 ...