并查集算法c语言版,并查集及其C程序实现.doc

并查集及其C程序实现

等价关系与等价类

从数学上看,等价类是一个对象(或成员)的集合,在此集合中的所有对象应满足等价关系。若用符号"≡"表示集合上的等价关系,那么对于该集合中的任意对象x,y, z,下列性质成立:

1、自反性:x ≡ x

2、对称性:若 x ≡ y 则 y ≡ x

3、传递性:若 x ≡ y 且 y ≡ z 则 x ≡ z

因此,等价关系是集合上的一个自反、对称、传递的关系。

通过金属线连接起来的电器的连通性,就是一种等价关系。这种关系显然具有自反性,因为任何一个器件都是与自身连通的;如果a 电连通b,那么b一定也电连通a,因此这种关系具有对称性; 若a连通到b,并且b连通到c,那么a连通到c 。

并查集

并查集的一般用途就是用来维护某种具有自反、对称、传递性质的关系的等价类。并查集一般以树形结构存储,多棵树构成一个森林,每棵树构成一个集合,树中的每个节点就是该集合的元素,找一个代表元素作为该树(集合)的祖先。

并查集支持以下三种操作:

1、Make_Set(x) 把每一个元素初始化为一个集合

初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身。

2、Find_Set(x) 查找一个元素所在的集合

查找一个元素所在的集合,只要找到这个元素所在集合的祖先即可。判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。

3、Union(x,y) 合并x,y所在的两个集合

合并两个不相交集合操作很简单:首先设置一个数组Father[x],表示x的"父亲"的编号。那么,合并两个不相交集合的方法就是,找到其中一个集合的祖先,将另外一个集合的祖先指向它。

并查集的优化

1、Find_Set(x)时 路径压缩

寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度,有没有办法减小这个复杂度呢?

答案是肯定的,这就是路径压缩,即当我们经过"递推"找到祖先节点后,"回归"的时候顺便将它的子孙节点都直接指向祖先,这样以后再次Find_Set(x)时复杂度就变成O(1)了。

2、Union(x,y)时 按秩合并

即合并的时候将元素少的集合合并到元素多的集合中,这样合并之后树的高度会相对较小。

主要代码实现/* father[x]表示x的父节点 */

int father[MAX];

/* rank[x]表示x的秩 */

int rank[MAX];1

2

3

4

5

6/* 初始化集合 */

void Make_Set(int x)

{

father[x] = x;

rank[x] = 0;

}

1

2

3

4

5

6

7

8

9/* 查找x元素所在的集合,回溯时压缩路径 */

int Find_Set(int x)

{

if (x != father[x])

{

father[x] = Find_Set(father[x]);

}

return father[x];

}1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19/* 按秩合并x,y所在的集合 */

void Union(int x, int y)

{

x = Find_Set(x);

y = Find_Set(y);

if (x == y) return;

if (rank[x] > rank[y])

{

father[y] = x;

}

else

{

if (rank[x] == rank[y])

{

rank[y]++;

}

father[x] = y;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/497402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web 服务策略断言语言 (WS-PolicyAssertions)

原文:http://www.microsoft.com/china/msdn/library/webservices/webservices/WebServicesPolicyAssertionsLanguage(WS-PolicyAssertions).mspxWeb 服务策略断言语言 (WS-PolicyAssertions) 发布日期: 4/26/2004| 更新日期: 4/26/2004版本 1…

周志华:严肃的研究者就不该去触碰强人工智能

来源:知识分子概要:关于人工智能,长期存在两种不同的目标或者理念。关于人工智能,长期存在两种不同的目标或者理念。一种是希望借鉴人类的智能行为,研制出更好的工具以减轻人类智力劳动,一般称为“弱人工智…

几种限流器(RateLimiter)原理与实现

来源:https://blog.csdn.net/netyeaxi/article/details/104270337 限流器(RateLimiter)主要有两种算法: 漏桶算法 令牌桶算法 它们都是网络世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)时经…

c语言如何随机选择入口,c语言随机排列-----适用于初学者

本程序只是实现了基本的数字随机排列,如有不懂,留言提问。。。// 随机排序.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "time.h"#include "stdio.h"#include "stdlib.h"int _tmain(int …

The Best and the Worst

Joe Sanders has the most beautiful garden in our town. Nearly everybody enters for “The Nicest Garden Competition” each year,but Joe wins every time.Bill Friths garden is larger than Joes.Bill works harder than Joe and grows more flowlers and vegetables,…

guava限流器RateLimiter原理及源码分析

来源:https://www.cnblogs.com/zhandouBlog/p/11743660.html 前言 RateLimiter是基于令牌桶算法实现的一个多线程限流器,它可以将请求均匀的进行处理,当然他并不是一个分布式限流器,只是对单机进行限流。它可以应用在定时拉取接…

185页深度报告 扒一扒AI金融的老底【附下载】

来源:智东西概要:2016年,中国爆出8家独角兽,总估值964亿美元位冠全球;2017年,毕马威全球百佳金融科技企业前三甲,蚂蚁金服、众安保险、趣店,皆来自中国;过往两年&#xf…

夹娃娃动画Android,手机模拟抓娃娃

手机模拟抓娃娃让你通过手机足不出户也能感受娃娃机的乐趣,萌趣的卡通形象,清新治愈的设计风格,简单上手的玩法,赶快加入进来冲击最高分吧,点击下载手机模拟抓娃娃开始你的挑战!手机模拟抓娃娃介绍手机模拟抓娃娃游戏是一款模拟进行的真人在线抓娃娃的掌上控制的休闲…

Inline Method(内联函数)

一个函数的本体与名称同样清楚易懂 int getRating() {return moreThanFiveLateDeliveries() ? 2 : 1; }boolean moreThanFiveLateDeliveries() {return numberOfLateDelivers > 5; } 重构后 int getRating() {return (numberOfLateDelivers > 5) ? 2 : 1; }

XML 简单操作

<?xml:namespace prefix o /> <?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Oberons Legacy</title> <author>Corets, Ev…

android友盟错误日志,Taro(React-native)集成友盟错误日志分析U-App移动统计

1、先去友盟官网注册应用&#xff0c;获取到appkey&#xff0c;友盟移动统计分析U-App&#xff0c;这个步骤就不贴出来了&#xff0c;需要注意的是ios和Android 不能使用同一个appkey&#xff0c;需要分别创建两个应用&#xff0c;应用名称可以在后面加上平台名称&#xff0c;例…

2018年中国新零售市场研究报告——概念、模式与案例【附下载】

来源&#xff1a;亿欧概要&#xff1a;“新零售” 之“新”在于顺势下的“变化”&#xff0c;不应该局限于“阿里巴巴的新零售”。报告尝试从一个更宽广的视角&#xff0c;对当前零售业变化的背景和各种驱动因素进行分析&#xff0c;总结当下时间段零售行业参与者的新动作&…

[导入]ASP.NET 配置节架构

ASP.NET 配置节架构文章来源:http://blog.csdn.net/21aspnet/archive/2004/11/04/167417.aspx转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2004/11/05/816261.html

重构--思维导图

#原图 System.out.println("https://www.processon.com/view/60fa8c441e085366ea4c2b9e?fromnew1");

Android代码导出数据库,导入/导出到android sqlite数据库

我看过几篇关于如何在android中导入和导出数据库的帖子,我找到了这些代码,但我似乎无法使它工作.我收到错误java.io.filenotfoundexception / storage / sdcard0 / BackupFolder / DatabaseName&#xff1a;打开失败的ENOENT(没有这样的文件或目录).我改变了一些东西,但我仍然没…

谷歌Jeff Dean团队提出利用深度学习对「电子健康记录」数据进行分析,可提高医疗诊断预测的准确性

原文来源&#xff1a;arXiv作者&#xff1a;Alvin Rajkomar、Eyal Oren、Kai Chen、Andrew M. Dai、Nissan Hajaj、Peter J. Liu、Xiaobing Liu, Mimi Sun、Patrik Sundberg、Hector Yee、Kun Zhang、Yi Zhang、Gavin E. Duggan、Gerardo Flores、Michaela Hardt、Jamie Irvine…

想太多……

想太多总是伤神&#xff0c;不晓得是因为早上打针打太多了还是晚上想太多了&#xff0c;现在有点头疼…… 被成全的人&#xff0c;应该是幸福的人&#xff0c;还有什么好抱怨的呢……亲眼看到成全我的人的痛苦&#xff0c;难道不应该更珍惜现在的快乐和幸福么&#xff1f; 不去…

Inline Temp(内联临时变量)

一个临时变量&#xff0c;只被一个简单表达式赋值一次&#xff0c;而它妨碍了其他重构手法 double basePrice anOrder.basePrice(); return basePrice > 1000; 重构后 return anOrder.basePrice() > 1000;

android卫星菜单中间,Android卫星菜单:android-satellite-menu

android-satellite-menu实现点击主按钮&#xff0c;会弹出多个围绕着主按钮排列的子按钮&#xff0c;从而形成一个卫星弹出式菜单。子按钮弹出和消失的动画效果都很棒。这种弹出式菜单按钮应用在Path2.0中。用法在你的view xml中添加组件定义&#xff0c;如下示例&#xff1a;x…

NLP顶级专家Dan Roth :自然语言处理领域近期的任务和主要应用

来源&#xff1a;AI科技大本营概要&#xff1a;1月28日消息&#xff0c;《麻省理工科技评论》新兴科技峰会EmTech China在北京召开&#xff0c;营长也受邀参加&#xff0c;会上有多位人工智能领域的重磅大佬出没&#xff0c;Dan Roth 就是其中一位。1月28日消息&#xff0c;《麻…