您的位置:首页 > 其它

并查集学习笔记1

2016-04-21 15:35 232 查看
首先我说一个题目让大家形象的感觉一下并查集到底是用来干什么的

警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,但是却不能判断有多少个团伙,通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。有可能一个犯罪团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。

看到这个题目我们首先可能想到的就是把相互认识的独立的人看成是顶点,把他们之间的关系建立成边,建立一个图模型,转化成求图的连通分量的个数。

对,这个方法不错,可以采用。可是具体的我们用什么办法来求解连通分量的个数呢?我们非常熟悉的方法就是DFS.

除了DFS,我们还有一种高效的方法求解就是并查集的方法。

从这个例子我们就可以引申出并查集具体是来做什么的了。

其实简单来说并查集就是用来解决动态连通性的问题

可以总结为一类问题的模型就是:

给定n个元素,我们动态的给定这些元素之间的关系,判断这两个元素是否在一个集合中,如果存在在同一个集合,不做任何操作,如果不在同一个集合的话,就合并两个集合,通过不断的动态给定元素之间的关系,不断更新各个集合的连通性。

那到底并查集定义是什么呢?下面给出了三条:

1)有若干个不相交集合

2) 每个集合中有一个代表(任意选出用于识别集合)

3)能够实现较快的合并和查找元素所在集合的操作

并查集有三种操作两种表示

三种操作:初始化(MAKE-SET(x)):把每个元素初始化为其自己的单元素集合

合并(UNION(x,y)):合并x和y所在的两个集合

查找(FIND-SET(x)):查找x所在集合即x所在集合的代表

两种表示:链表表示和森林表示

链表表示

每一个集合用一个链表表示,包含head和tail属性

链表的每一个元素代表集合的一个成员
链表的第一个元素作为集合的代表
链表中的元素顺序可以是任意的



森林表示:

每棵树表示一个集合
每个成员仅指向其父结点

树的根为集合的代表指向自己
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: