博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
8月14日训练日记(并查集)
阅读量:3950 次
发布时间:2019-05-24

本文共 965 字,大约阅读时间需要 3 分钟。

今天我看了并查集的内容。

并查集是一种支持合并与查询的数据结构,简单来说,主要包含两步操作:

1.Get,查询一个元素属于哪一个集合。

2.Merge,把两个集合合并成一个大集合。

操作中,主要采用“代表元”法,即为每一个集合选择一个固定的元素,作为整个集合的代表。

形象的,把并查集看作一个森林,是用一棵树存储每个集合,书上的每一个节点都是一个元素,树根是集合的代表元素。

为了提高效率,又引入了路径压缩与按秩合并两种思想。

代码具体实现说明:

1.并查集的存储

使用一个数组fa保存父节点(根的父节点设为自己)

int fa[size];

2.初始化

设有n个元素,起初所有元素各自构成一个独立的集合,即有n颗1个节点的数。

for(int i=1;i<=n;i++)

fa[i]=i;

3.并查集的Get操作

若x是树根,则x就是集合代表,否则递归访问fa[x]直至根节点。

int get(x){  if(x==f[x])     return x;else   return fa[x]=get(fa[x]);//路径压缩,fa直接赋值为代表元素 }

4.Merge操作

合并元素x和元素y所在的集合,等价于让x的树根作为y的树根的子节点。void merge(int x,int y){  fa[get(x)]=get(y);}

再就是“扩展域”与“边带权”的并查集

用一个数组d,用d[x]保存节点x到父节点fa[x]之间的边权,

在路径压缩后,每个访问过的节点都会直接指向树根,我们同时更新这些点的d值,就可以利用路径压缩来统计每个节点到树根之间路径上的一些信息。

在某些问题中,传递关系不止一种,能够互相导出,此时它就有了用武之地。

Get操作int get(int x){  if(x==fa[x]) return x;  int root=get(fa[x]);//递归计算集合代表  d[x]+=d[fa[x]];//对边权求和  return fa[x]=root;//路径压缩}
size 数组在每个树根上记录集合大小。void merge(int x,int y){  x=get(x);  y=get(y);  fa[x]=y;  d[x]=size[y];  size[y]+=size[x];}

 

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

你可能感兴趣的文章
大数据下的帝都魔都的爱恨情仇
查看>>
GitHub最著名的20个Python机器学习项目!
查看>>
小白都能看懂的神经网络入门,快收下吧~
查看>>
当白帽黑客遇到了网络诈骗,他是如何套路并反制骗子的?
查看>>
手把手教你36小时搭建无人超市系统 !(附代码)
查看>>
2017新生儿爆款名字出炉!90后的父母们最受欢迎的居然是.....
查看>>
全景图解高铁数据,谁是最有潜力的高铁城市?
查看>>
张小龙现场“约战”跳一跳,发布2018微信全新计划(内附演讲全文)
查看>>
爬取电影天堂的最新电影
查看>>
运维总监不会告诉你这些有趣但鲜为人知的 Linux 命令
查看>>
2017新浪微整形年度大数据报告
查看>>
实战 | 用 Python 选股票,据说可以多挣个20%
查看>>
重磅 | 数据挖掘之父韩家炜:文本语料库的数据挖掘(附视频+PPT下载)
查看>>
白话AI:看懂深度学习真的那么难吗?初中数学,就用10分钟
查看>>
超全的 Linux 机器的渗透测试命令备忘表,共16表128条命令
查看>>
代码传奇 | 明明可以靠颜值 却用代码把人类送上了月球的女人——Margaret Hamilton
查看>>
教你用Java来玩答题(百万英雄/冲刺大会等)
查看>>
用Python做跳一跳外挂太浪费了,这种技能让你目瞪口呆
查看>>
如何在Python中快速进行语料库搜索:近似最近邻算法
查看>>
比特币这么火热,看看这篇比特币初学者指南
查看>>