不相交集ADT 你是和谁是一类人?
//不相交集ADT (抽象数据类型)
//一般用于集合运算
//用树,这种结构组成,有多个树(=森林)
//属于同一颗数的元素,表示处于同一个集合中
//主要支持2个操作.
//1. Find操作,找到给定元素所属的集合编号
//2. Union操作,给出2个元素,将他们纳入同一个集合中
//常见使用场景:元素a和b是否属于同一集合?
//find(a) == find(b) :true 表示a和b属于同一集合
//但注意:因为是不相交集,所以一个元素在同一时刻,只能最多属于一个集合中,不能存在同时属于两个集合中的情况(因为这是存在相交集的情况)
public class Disjoint {
// int setSize;//集合个数
//
//正数:存储下标作为所属于的集合,下标是元素编号,也是集合编号,某2个元素是否属于相同集合是指这2个元素所指向的最终集合编号是否一致
//负数:表示当前集合树的深度,-1表示树深度为1,该元素只属于自己这个集合,用于 按高度求并
int[] set;
public Disjoint(int setSize) { //集合大小
// this.setSize = setSize;
set = new int[setSize];
for (int i = 0; i < setSize; i++)
set[i] = -1; //-1表示单独属于一个集合
}
//查找元素所属集合的编号
public int find(int elementType) {
if (check(elementType)) return elementType;
if (set[elementType] <= 0) //集合树根:该元素不和其他元素没有处于同一集合,返回该元素本身作为集合类型
return elementType;
//set[elementType] = find(set[elementType]) 是为了压缩路径(减少深度),每次查找时,将深度过深的树,顺着所属路径给扁平化,节点直接指向树根
return set[elementType] = find(set[elementType]); //集合子树:顺着该元素所属的集合类型 作为元素类型,递归的找到树根(最终所属的用作该集合统一标识的 集合类型)
}
//对2个元素求并
// setRoot2 -> setRoot1
public void union(int setRoot1, int setRoot2) {
if (check(setRoot1) || check(setRoot2)) return;
//求并方式有3种
//1. 普通求并方式 ,缺点是树深可能会退化成单链表 N
// set[setRoot2] = setRoot1;
//2. 按大小求并
//3. 按高度求并 ,保证所有树的最大深度最多为 logN
//树根节点挂载原则:每次求并2个树的时候,把深度小的树接入深度大的树,当2个树深度一样的时候,作为根的树深度+1
if (set[setRoot1] < set[setRoot2]) //root1 更深
set[setRoot2] = setRoot1; //将浅树 root2的根指向root1
else {
if (set[setRoot1] == set[setRoot2])
set[setRoot2]--; //两树一样深,让root2 深度加1,接下来让root1指向root2
set[setRoot1] = setRoot2; //root2更深,将root1 指向 root2
}
}
public boolean isSameUnion(int a, int b) {
if (check(a) || check(b)) return false;
return find(a) == find(b);
}
private boolean check(int setRoot2) {
return setRoot2 > set.length || setRoot2 < 0;
}
public static void main(String[] a) {
Disjoint disjoint = new Disjoint(5);
int 张三 = 0; //嗯,java默认支持Unicode作为源码中的字符集
int 李四 = 1;
int 赵家六 = 2;
int 热爱大自然一类人 = 3;
int 热爱老大哥一类人 = 4;
disjoint.union(热爱大自然一类人, 张三);
disjoint.union(热爱老大哥一类人, 赵家六);
disjoint.union(赵家六, 李四);
System.out.println("张三 和 李四 是一类人?" + disjoint.isSameUnion(张三, 李四));
System.out.println("张三 是 热爱大自然一类人?" + disjoint.isSameUnion(张三, 热爱大自然一类人));
System.out.println("李四 是 热爱大自然一类人?" + disjoint.isSameUnion(李四, 热爱大自然一类人));
System.out.println("李四 是 热爱老大哥一类人?" + disjoint.isSameUnion(李四, 热爱老大哥一类人));
System.out.println("赵家六 是 热爱老大哥一类人?" + disjoint.isSameUnion(赵家六, 热爱老大哥一类人));
System.out.println("赵家六 和 李四 是一类人?" + disjoint.isSameUnion(赵家六, 李四));
}
}
输出
张三 和 李四 是一类人?false
张三 是 热爱大自然一类人?false
李四 是 热爱大自然一类人?false
李四 是 热爱老大哥一类人?true
赵家六 是 热爱老大哥一类人?true
赵家六 和 李四 是一类人?true
不相交集ADT 你是和谁是一类人?的更多相关文章
- 前阿里CEO卫哲谈阿里创业经验:如何找人、找钱、找方向?(不同的阶段分别有:时间优先、金额优先、比例优先,不要做平台,太难)
新浪科技李根 整理报道 卫哲现在是御嘉基金的创始合伙人,他另一个更加知名的身份是阿里巴巴(B2B)前CEO,在2006年到2011年的时间里,卫哲见证了阿里巴巴如何利用人才.资本和方向选择一路壮大. ...
- 北漂的IT人
北京的互联网人,是工作日完全没有个人生活的一类人,也是整个北漂大队伍中,下班时间最晚的那一波人,如果赶上周末还要加班,那毫不夸张地说,你的整个人生都在互联网上奋斗着. 虽说十点上班让多少行内外的人羡慕 ...
- 我的跟我学Ffmpeg 视频受众有哪些人
经常有人问我如何学习音视频以及如何学习Ffmpeg,问我有没有比较好的书的书推荐.比较好的音视频以及FFmpeg方面的 书,我了解到的比较全面又能深入浅出的还真没有.很多朋友都推荐雷神的博客,雷神的博 ...
- 连载《一个程序猿的生命周期》-《发展篇》 - 7.是什么阻碍了"程序猿"的发展?
有两件事想记录一下,具有普遍性和代表性."程序猿"加了引号,是泛指一类人,也并非局限于IT行业. 山东子公司的总经理是公司大股东之一,个子不高.有些秃顶.面容显老,但看 ...
- 浅谈我对DDD领域驱动设计的理解
从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...
- JavaScript面向对象
理解对象 对象这个词如雷贯耳,同样出名的一句话:XXX语言中一切皆为对象! 对象究竟是什么?什么叫面向对象编程? 对象(object),台湾译作物件,是面向对象(Object Oriented)中的术 ...
- 了解JavaScript 面向对象基础 & 原型与对象
面向对象语言中的对象 老是能听到什么基于对象, 面向对象. 什么是对象, 如果有面向对象基础的人可以无视了, 下面举个简单的例子给大家讲讲面向对象中, 对象的定义, 这个是比较通用的, 不过对于JS来 ...
- 安装Ubuntu的那些事儿
这是博主第一次写博客,本人虽然目前就读的专业属计算机,但目前也是属于新手上路的那一类人.正好不久前解决了一个困扰了我很久的问题 ,现在拿出来给大家分享一下. 上个学期学校的工作室给大家集中普及linu ...
- HTML 学习笔记 JavaScript(面向对象)
现在让我们继续跟着大神的脚步前进 学习一下JavaScript中的面向对象的思想,其实作为一个iOS开发者,对面向对象还是比较熟悉的,但是昨晚看了一下Js中的面向对象,妈蛋 一脸萌比啊.还好有大神.让 ...
随机推荐
- 第二个视频作品《[SpringCloudAlibaba]微服务之注册中心nacos》上线了
1.场景描述 第二个视频作品出炉了,<[SpringCloudAlibaba]微服务之注册中心nacos>上线了,有需要的朋友可以直接点击链接观看.(如需购买,请通过本文链接购买) 2. ...
- django nginx 504 time-out 错误
报错: 分析 nginx和uwsgi整合时有三个参数可以用于设置超时时间: 1.uwsgi_connect_timeout: 默认60秒,与uwsgi-server连接的超时时间,该值不能超过75秒. ...
- ICMP和重定向攻击
目录 ICMP数据报格式 smurf攻击 ICMP重定向攻击 基于libpcap的sniffer raw socket 定义包头 解析数据包 重定向 ICMP数据报格式 https://zhuanla ...
- 获取redis中所有的key,清空整个 Redis 服务器的数据
获取 redis 中所有的 key 可用使用 *. redis 127.0.0.1:6379> KEYS * Redis Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数 ...
- linux系统的特殊符号
符号 作用 示例 # 注释符号,井号后的内容不会执行 echo #WORD ~ 当前用户的家目录 cd ~ ; 命令顺序执行,前面执行成功与否对后面没影响 COMMAND1 ; COMMAND2 &a ...
- 10.jenkins 按角色分配
在实际的生产中,需要项目比较多.不同的用户需要对应 不同的项目工程 .这个时候,我们需要按角色给与权限. 要实现这个功能,需要一个插件来完成 . Role-based Authorization St ...
- mysql windows 安装5.7
E:\MySQL\MySQLServer57\bin>net start mysqlMySQL 服务无法启动. 解决办法: 手动在安装目录创建文件 my.ini [mysql] # 设置mysq ...
- day100_12_4DataFrame和matplotlib模块
一.Dataframe的分组. 再网页表格数据 的分析中,可以使用以下语句进行爬取表格. res = pd.read_html('https://baike.baidu.com/item/NBA%E6 ...
- 剑指Offer-38.平衡二叉树(C++/Java)
题目: 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 分析: 可以从根节点开始遍历每一个节点,求得节点左右子树的最大高度,判断是不是平衡二叉树.这样做的问题在于会重复遍历节点,造成不必要的浪费. 所 ...
- PhpSpreadsheet的简单使用
由于PHPExcel已经不再维护,PhpSpreadsheet是PHPExcel的下一个版本.PhpSpreadsheet是一个用纯PHP编写的库,并引入了命名空间,PSR规范等.这里简单介绍下Php ...