博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法学习】高级数据结构2 种类并查集
阅读量:2007 次
发布时间:2019-04-28

本文共 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 是它的敌人。于是这两句表示 12 的敌人,21 的敌人,如下图:
在这里插入图片描述

现在我们知道 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 看做同一类人 An+1~2n 看做另一类人 B(1, 2), (2, 4) 是敌对关系,但是我们不知道它们分别是哪一类人,于是我们都做出尝试:A 中的 1, 2 分别和 B 中的 2, 4 敌对,B 中的 1, 2 分别和 A 中的 2, 4 敌对。

判断 1, 4 是不是朋友,只需看 A 中的 1B 中的 4B 中的 1A 中的 4 是否敌对(看两者之一就可以了)——很显然不敌对,于是是朋友。


2. 实际例题

为了实际掌握种类并查集的工作原理,我们需要做题:

:两个种类;
:两个种类;
:两个种类;
:三个种类;

转载地址:http://lxotf.baihongyu.com/

你可能感兴趣的文章
js初学笔记
查看>>
小根堆
查看>>
C++类型转换
查看>>
Linux下利用Valgrind工具进行内存泄露检测和性能分析
查看>>
vector clear 内部过程
查看>>
MFC单文档(SDI)转换成多文档(MDI)解决方案
查看>>
Linux/Ubuntu下安装VMWare Tools
查看>>
Linux/Ubuntu下的用户切换
查看>>
OpenCV基本数据类型
查看>>
DoG (Difference of Gaussian)角点检测
查看>>
追踪Google I/O动向——Google I/O 2012 有哪些亮点?
查看>>
解决Opencv高低版本不兼容问题
查看>>
“压缩感知” 之 “Hello World”
查看>>
机器学习——深度学习(Deep Learning)
查看>>
获取GB2312编码汉字的首字母【转】
查看>>
点阵汉字显示[转]
查看>>
自己制作软盘镜像文件
查看>>
有关内核的基本知识【转】
查看>>
对称多处理和微内核【转】
查看>>
操作系统手记4
查看>>