算法实践--不相交集合(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 ...
随机推荐
- js的event事件对象汇总
JavaScript事件对象是浏览器默认传入的,但是对于浏览器的兼容问题,我们需要对事件对象进行兼容.但是jQuery已经帮我们解决了所有兼容性的问题,并且给我们添加了很多有用的方法.已经是比较历史的 ...
- 浅谈树状数组(为什么lowbit(x)=x&(-x)
树状数组是一种支持单点修改和查询前缀和的数据结构 网上很多讲解它的博客了 这里重点讲一下为什么lowbit(x)=x&(-x) 树状数组代码量相对于线段树基本可以不计(太好写了) 因此NOIp ...
- Configure the Stanford segmenter for NLTK
>>> from nltk.tokenize.stanford_segmenter import StanfordSegmenter >>> segmenter = ...
- STL 小白学习(4) deque
#include <iostream> #include <deque> //deque容器 双口 using namespace std; void printDeque(d ...
- logging模块使用
日志介绍 日志级别: 默认显示级别为warning,(critical>error>warning>info>debug>notset) 日志格式配置,测试使用 impo ...
- learning makefile vpath(1)
- Spring Boot + Spring Cloud 实现权限管理系统 (系统服务监控)
系统服务监控 新建监控工程 新建Spring Boot项目,取名 kitty-monitor,结构如下. 添加项目依赖 添加 spring boot admin 的相关依赖. pom.xml < ...
- 兼容 Spring Boot 1.x 和 2.x 配置类参数绑定的工具类 SpringBootBindUtil
为了让我提供的通用 Mapper 的 boot-starter 同时兼容 Spring Boot 1.x 和 2.x,增加了这么一个工具类. 在 Spring Boot 中,能够直接注入 XXProp ...
- nodejs 安装失败 ,出现error 2502 和error2503
出现error 2502 和error2503是因为win8的权限问题所导致的,具体说就是要以管理员身份进行安装就可以解决,下面详细来说一下. 1.cmd命令行点击以管理员身份运行. 2.这时候就可以 ...
- 从零开始学Shell(一)
1.$表示普通用户,#表示超级用户.2.sh /home/path/script.sh3.chmod a+x script.sh 增加可执行权限 ./script.sh #./表示当前的 ...