【算法学习】高级数据结构2 种类并查集
发布日期:2021-07-01 02:50:32
浏览次数:3
分类:技术文章
本文共 900 字,大约阅读时间需要 3 分钟。
文章目录
1. 种类并查集
如果说一般的并查集,维护的是等价、连通关系,例如朋友的朋友是朋友。那么种类并查集,维护的就是对立关系:敌人的敌人是朋友,或者更宽泛的说,是多个种类集合间的一种循环对称的关系。
常见的做法是将原并查集扩大一倍规模,并划分为两个种类。在同种类的并查集中合并,和原始的并查集没什么区别,仍然表达 他们是朋友
这个含义。在不同种类的并查集中进行合并,表达的则是 他们是敌人
这个含义。
例如,要维护 4
个元素的种类并查集,要开 8
个单位的空间:
1-4
维护朋友关系,5-8
维护敌人关系。如果我们现在知道 1, 2
是敌人,该怎样做呢?我们用新的 merge
函数,merge(1, 2 + n), merge(1 + n, 2);
。n
在这里等于 4
,对于编号为 i
的元素,i + n
是它的敌人。于是这两句表示 1
是 2
的敌人,2
是 1
的敌人,如下图: 现在我们知道 2, 4
是敌人,那么 merge(2, 4 + n), merge(2 + n, 4);
:
2, 4
是敌人,1, 2
是敌人。所以有敌人的敌人就是朋友, 1, 4
是朋友——通过 2 + n
这个元素将 1, 4
间接地连接起来了。1, 4
现在在同一个集合之中,表示它们是同一类人。 上述就是种类并查集的基本工作原理。我们把 1~n
看做是原本的并查集,n+1~2n
看做是表示敌对关系的并查集。
更复杂的看法是:将
判断1~n
看做同一类人A
,n+1~2n
看做另一类人B
。(1, 2), (2, 4)
是敌对关系,但是我们不知道它们分别是哪一类人,于是我们都做出尝试:A
中的1, 2
分别和B
中的2, 4
敌对,B
中的1, 2
分别和A
中的2, 4
敌对。1, 4
是不是朋友,只需看A
中的1
和B
中的4
、B
中的1
和A
中的4
是否敌对(看两者之一就可以了)——很显然不敌对,于是是朋友。
2. 实际例题
为了实际掌握种类并查集的工作原理,我们需要做题:
:两个种类; :两个种类; :两个种类; :三个种类;转载地址:https://memcpy0.blog.csdn.net/article/details/108287224 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月19日 14时50分16秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
OV5620的视频驱动
2019-05-01
C++中两个类交叉定义或递归定义的解决办法
2019-05-01
ECharts is not Loaded解决方案
2019-05-01
ECharts地图显示不完整,只显示南海诸岛问题
2019-05-01
echarts切换tab时,第一个图表显示,第二个图表不显示的解决办法
2019-05-01
记一次Hive 行转列 引起的GC overhead limit exceeded
2019-05-01
OpenGL ES八 - 交叉存取顶点数据
2019-05-01
crontab定时任务写法
2019-05-01
nginx: [emerg] unknown directive "if($remote_addr" in /usr/local/tools/nginx/conf/nginx.conf:57
2019-05-01
module pip has no attribute main问题解决
2019-05-01
LeetCode 134.Gas Station (加油站)
2019-05-01
Python之命名元组 (namedtuple)
2019-05-01
使用libpcap过滤arp
2019-05-01
在VC环境中调试跟踪变量
2019-05-01
[转帖]Robots.txt指南
2019-05-01
Eclipse + MyEclipse下配置J2EE工程(英文界面)
2019-05-01
Eclipse及其插件下载网址大全
2019-05-01
正则表达式简介(微软)--6.优先权顺序
2019-05-01
多用户与多租户的区别
2019-05-01