并查集学习笔记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属性
链表的每一个元素代表集合的一个成员
链表的第一个元素作为集合的代表
链表中的元素顺序可以是任意的
森林表示:
每棵树表示一个集合
每个成员仅指向其父结点
树的根为集合的代表指向自己
警察抓到了n个罪犯,警察根据经验知道他们属于不同的犯罪团伙,但是却不能判断有多少个团伙,通过警察的审讯,知道其中的一些罪犯之间相互认识,已知同一犯罪团伙的成员之间直接或间接认识。有可能一个犯罪团伙只有一个人。请你根据已知罪犯之间的关系,确定犯罪团伙的数量。
看到这个题目我们首先可能想到的就是把相互认识的独立的人看成是顶点,把他们之间的关系建立成边,建立一个图模型,转化成求图的连通分量的个数。
对,这个方法不错,可以采用。可是具体的我们用什么办法来求解连通分量的个数呢?我们非常熟悉的方法就是DFS.
除了DFS,我们还有一种高效的方法求解就是并查集的方法。
从这个例子我们就可以引申出并查集具体是来做什么的了。
其实简单来说并查集就是用来解决动态连通性的问题
可以总结为一类问题的模型就是:
给定n个元素,我们动态的给定这些元素之间的关系,判断这两个元素是否在一个集合中,如果存在在同一个集合,不做任何操作,如果不在同一个集合的话,就合并两个集合,通过不断的动态给定元素之间的关系,不断更新各个集合的连通性。
那到底并查集定义是什么呢?下面给出了三条:
1)有若干个不相交集合
2) 每个集合中有一个代表(任意选出用于识别集合)
3)能够实现较快的合并和查找元素所在集合的操作
并查集有三种操作两种表示
三种操作:初始化(MAKE-SET(x)):把每个元素初始化为其自己的单元素集合
合并(UNION(x,y)):合并x和y所在的两个集合
查找(FIND-SET(x)):查找x所在集合即x所在集合的代表
两种表示:链表表示和森林表示
链表表示:
每一个集合用一个链表表示,包含head和tail属性
链表的每一个元素代表集合的一个成员
链表的第一个元素作为集合的代表
链表中的元素顺序可以是任意的
森林表示:
每棵树表示一个集合
每个成员仅指向其父结点
树的根为集合的代表指向自己
相关文章推荐
- iOS app各种图片尺寸(Icon,Launchimg,应用市场)
- c++ map 记录。为了自己记录理解
- [!] Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfil
- 魔方阵原理及十种解法(C语言)
- libevent 写了一个简单地web服务器
- 深入理解javascript的闭包
- IE 浏览器下英文 微软雅黑 不起作用
- 公共POI导出Excel方法--java
- javascript数组
- 【小松教你手游开发】【unity实用技能】对象的简单平移与旋转
- java中的多态总结
- Mac下Lua Sublime Text3 开发环境搭建
- [FAQ13934]如何添加Static Library (静态库)到Share Library(共享库)
- 深度学习之图像分割 《Fully Convolutional Networks for Semantic Segmentation》—FCN
- HDU 1180 诡异的楼梯
- DAY6
- Android里Service的bindService()和startService()混合使用深入分析
- 移动端设计尺寸基础知识
- 恢复误删的桌面 回收站
- 批处理实现自动删除过期文件的定期操作