`

并查集及举例

 
阅读更多

一、 并查集: (union-find sets)

    一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数等。最完美的应用当属:实现Kruskar算法求最小生成树。

 

并查集的三种操作

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

初始化后每一个元素的父亲节点是它本身,每一个元素的祖先节点也是它本身(也可以根据情况而变)。

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

查找一个元素所在的集合,其精髓是找到这个元素所在集合的祖先!这个才是并查集判断和合并的最终依据。
判断两个元素是否属于同一集合,只要看他们所在集合的祖先是否相同即可。
合并两个集合,也是使一个集合的祖先成为另一个集合的祖先,具体见示意图

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

合并两个不相交集合操作很简单:
利用Find_Set找到其中两个集合的祖先,将一个集合的祖先指向另一个集合的祖先。如图


并查集的优化

1 、Find_Set(x)时 路径压缩
寻找祖先时我们一般采用递归查找,但是当元素很多亦或是整棵树变为一条链时,每次Find_Set(x)都是O(n)的复杂度,有没有办法减小这个复杂度呢?
答案是肯定的,这就是路径压缩,即当我们经过"递推"找到祖先节点后,"回溯"的时候顺便将它的子孙节点都直接指向祖先,这样以后再次Find_Set(x)时复杂度就变成O(1)了,如下图所示;可见,路径压缩方便了以后的查找。

2 、Union(x,y)时 按秩合并
即合并的时候将元素少的集合合并到元素多的集合中,这样合并之后树的高度会相对较小。

 

二、举例——《编程之美》P205 区间重合判断

#include <iostream>
using namespace std;

/*
	测试数据:
1 6
2 3
1 2
3 9
0 0

*/

//区间重合判断,并查集求解
//家丁输入为整数,范围是n<=1000
const int NUMRANGE=1001;

int rank[NUMRANGE];
int p[NUMRANGE];

void MakeSet(int x){
	p[x]=x;
	rank[x]=0;
}

int FindSet(int x){
	if(x!=p[x]){
		p[x]=FindSet(p[x]);//回溯时压缩路径(将路径上所有节点父亲都赋予最终祖先)
	}
	return p[x];
}

void Union(int x,int y){
	x=FindSet(x);
	y=FindSet(y);

	//此后,x,y是两个集合的最终祖先!

	if(x==y) return;

	if(rank[x]>rank[y]){
		p[y]=x;
	}else if(rank[x]<rank[y]){
		p[x]=y;
	}else{
		//rank[x]==rank[y]
		p[x]=y;//此时随便啦^^
		rank[y]++;
	}
}

int main(){
	/*
		1. 不连续的区间属于不同集合
		2. [0,2]区间在集合中有三个顶点:0,1,2
	*/

	int i;
	for(i=0;i<=1000;i++)
		MakeSet(i);

	int oriBg,oriEnd,tempBg,tempEnd;

	cin>>oriBg>>oriEnd;

	while(cin>>tempBg>>tempEnd){
		//0 0结束
		if(tempBg==0 && tempEnd==0)
			break;
		int j;
		for(j=tempBg;j<tempEnd;j++)
			Union(j,j+1);
	}

	//判断[oriBg,oriEnd]是否在目标区间内
	if(FindSet(oriBg)==FindSet(oriEnd))
		cout<<"在区间内"<<endl;
	else
		cout<<"不在!"<<endl;
}
 

 

  • 大小: 7.8 KB
分享到:
评论

相关推荐

    用树结构来实现并查集及其相关操作的C语言描述

    并查集是一种用于处理集合合并与查询的抽象数据类型,主要应用于解决元素分组和连接的问题。在C语言中,可以使用树结构,也就是父指针表示法来实现并查集。下面我们将详细讨论并查集的核心操作以及如何用树结构进行...

    oracle常用查询举例

    ### Oracle 常用查询举例详解 #### 一、设置查询环境 **1. 设置查询显示格式** 在进行Oracle查询时,我们常常需要调整查询结果的显示格式来满足不同的需求。例如,我们可以使用 `desc table` 命令来查看表的结构...

    sql多变查询举例 语句

    根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是SQL中的多表查询技术,具体涉及到了左连接(Left Join)、右连接(Right Join)、内连接(Inner Join)以及全连接(Full Outer Join)。...

    正则表达式速查 正则表达式举例 正则表达式学习

    - `(pattern)` 匹配 pattern 并捕获匹配结果。 - `(?:pattern)` 匹配 pattern 但不捕获匹配结果。 - 示例: - `'(dog|cat)'` 可以捕获 "dog" 或 "cat"。 - `'(?:dog|cat)'` 仅匹配 "dog" 或 "cat",但不会捕获...

    sql各种查询语句举例附 数据库

    常见的JOIN类型有INNER JOIN(只返回匹配的行),LEFT JOIN(返回左表所有行及右表匹配的行),RIGHT JOIN(返回右表所有行及左表匹配的行),FULL JOIN(返回两个表的所有行,即使某一边没有匹配项)。 7. **UNION...

    ibatis实例,mysql应用举例

    映射文件则定义了SQL语句和结果集的映射规则,使得Java对象与数据库表之间可以进行透明的转换。SqlSession提供了执行SQL和获取结果的方法,而Mapper接口则用于在业务逻辑层调用SQL。 在MySQL应用举例中,首先我们...

    ADO C++源码及调用举例

    在"ADO C++源码及调用举例"中,我们将会探讨以下几个关键知识点: 1. **ADO基础概念**:ADO的核心是Connection、Command、Recordset、Parameter和Error等对象,它们分别代表数据库连接、命令执行、数据集、参数和...

    系统安全性测试问题举例.docx

    测试人员应检查数据类型、字符集、长度限制、空输入、参数必要性、重复输入和数值范围。例如,对于字符串,需要确认是否允许特定的字符和空格。 2. **访问控制问题**:测试应关注用户身份验证和权限管理。通过复制...

    数据库oracle中PLSQL语句简介及使用方法的举例说明

    存储过程是一组预编译的PL/SQL语句,可以接受参数并返回结果。函数类似,但必须返回一个值。存储过程和函数提高了代码的重用性和性能。 九、触发器 触发器是一种特殊的存储过程,会在特定的数据库事件(如INSERT、...

    行业-86以MySQL单表查询来举例,看看执行计划包含哪些内容(1)?.rar

    在MySQL数据库管理中,执行计划是优化SQL查询性能...对于大型数据集,这些优化措施尤其关键,因为它们直接影响到系统的响应时间和资源消耗。因此,学习并掌握分析执行计划的能力是每个数据库管理员和开发者的必备技能。

    多维数据集与商业智能例子

    本话题主要探讨如何使用SQL报表来处理多维数据集,并通过商业智能工具实现增量处理,以提高数据处理速度和效率。以下是关于这个主题的详细解释。 一、多维数据集 多维数据集是数据仓库中的一个关键组成部分,它将...

    SqlCommandBuilder举例应用

    1. **创建 `SqlDataAdapter`**:首先需要创建一个 `SqlDataAdapter` 实例,并指定查询命令(如 `SELECT * FROM [表名]`)。 2. **创建 `SqlCommandBuilder`**:接着使用 `SqlCommandBuilder` 的构造函数,传入 `...

    bbf算法的详细介绍与应用举例

    ### bbf算法的详细介绍与应用举例 #### 一、引言 在计算机视觉领域,特别是形状索引(Shape Indexing)技术中,一种名为“Best Bin First”(BBF)的搜索算法因其在高维特征空间中的高效表现而受到广泛关注。本文...

    数据库中的模糊查询技术

    1.1 模糊集理论:模糊查询基于模糊集理论,该理论由Lotfi Zadeh于1965年提出,它扩展了传统集合论,允许元素具有不同程度的属于集合的属性。 1.2 模糊匹配:模糊匹配是指在比较字符串时,考虑相似性而非精确相等。这...

    游标代码举例(sql)

    游标是SQL中的一种机制,它允许我们逐行处理查询结果集,就像在其他编程语言中使用指针遍历数组一样。在SQL中,游标主要用于处理交互式数据或者需要按顺序执行一系列操作的情况,例如在给定的例子中,我们需要根据...

    MySQL优化介绍和举例

    3. ROW、PAGE与簇集索引:理解不同存储格式对查询性能的影响,如ROW模式在插入和更新时可能更高效。 总结,MySQL优化是一个涉及多方面的工作,需要综合考虑数据库设计、查询编写、服务器配置和存储引擎选择等因素。...

    算法-克鲁斯卡尔

    3. **并查集**:为了检查新加入的边是否会形成环路,我们需要使用并查集数据结构。并查集能高效地处理查找和连接两个操作,确保在连接两个节点时不会将它们归并到同一个集合中,如果已经属于同一集合,则说明形成了...

    阿尔卡特7750SR常见命令集

    给出了在日常工作中常见的配置和维护命令,并针对性的对命令进行注释,作为维护命令集速查手册,不同于产品手册,将重点对维护和配置中的常用命令进行说明和举例,可以作为用户和工程师在基本的维护工作中的一个帮助...

    基础数据结构----刘汝佳

    并查集是一种处理元素集合合并及查询所属关系的高效数据结构。它支持两种基本操作:查找(Find)和合并(Union)。并查集通常用于图论中的连通性问题,如判断一组元素是否属于同一个集合。 ### 哈希表 哈希表是一种...

    ORACLE函数大全汇总详解(20100915补充修订版)

    - 示例:`SELECT department, AVG(salary) FROM employees GROUP BY department` 按部门分组并计算每个部门的平均薪资。 11. **HAVING**: 用于过滤GROUP BY产生的结果集。 - 示例:`SELECT department, COUNT(*) ...

Global site tag (gtag.js) - Google Analytics