`
king_tt
  • 浏览: 2101120 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

并查集--学习详解

 
阅读更多

文章作者:yx_th000 文章来源:Cherish_yimi (http://www.cnblogs.com/cherish_yimi/) 转载请注明,谢谢合作。

并查集学习:

l并查集:(union-find sets)

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

l并查集的精髓(即它的三种操作,结合实现代码模板进行理解):

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

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

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

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

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

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



l并查集的优化

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

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



l主要代码实现

#include<iostream>
#define MAXN 1000
using namespace std;

int father[MAXN];  // father[x]表示x的父节点
int rank[MAXN];    // rank[x]表示x的秩


//初始化集合
void make_set(int x){
	
	father[x] = x;  //根据实际情况指定的父节点可变化
	rank[x] = 0;    //根据实际情况初始化轶也有所变化

}



//查找x元素所在的集合,回溯时压缩路径
int find_set(int x){

	if(x != father[x]){
		father[x] = find_set(father[x]);  //这个回溯时的压缩路径是精华
	}
	return father[x];
}

/*
	按秩合并x,y所在的集合
	下面的那个if else结构不是绝对的,具体根据情况变化
	但是,宗旨是不变的即,按秩合并,实时更新秩。
*/

void merge(int x,int y) {
	
	x = find_set(x);
	y = find_set(y);
	if(rank[x] > rank[y]){
		father[y] = x;
	}
	else{
		if(rank[x] == rank[y]) {
			rank[y]++;
		}
		father[x] = y;
	}
}

int main()
{
	return 0;
}



分享到:
评论

相关推荐

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    Articles:文档和源代码。 关于如何开始学习算法和csharp。 如果您具有CC ++或其他编程语言知识,则很容易理解-C language program source code

    08-- 算法的#08--深入详解并查集union-find算法 09-- 算法#09--用简单的思维理解选择,插入,冒泡和希尔排序 10-- 算法#10--用简单的思维理解堆排序 算法# 用简单的思维理解归并排序和三向快速排序 12--

    cmd操作命令和linux命令大全收集

    29. rsop.msc-------组策略结果集 30. mem.exe--------显示内存使用情况 31. regedit.exe----注册表 32. winchat--------XP自带局域网聊天 33. progman--------程序管理器 34. winmsd---------系统信息 35. ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    此外,本书的配套光盘还免费提供了价值人民币330元的java教学视频,对java语言进行了全面讲解,帮助一些不会java语言的读者快速地从java基础知识的学习中过渡到java web的学习与开发上. 第1部分 xml篇. 第1章 xml...

    leetcode双人赛----:---

    leetcode双人赛 1 前言 ...并查集 2.5 图论 最短路 最小生成树 2.6 数论 辗转相除法 素数 快速幂 3 中级算法 3.1 二分搜索 最大化最小值 01分数规划 第k大值 最小化第k大值 其他二分搜索 3.2 常用技巧

    leetcode双人赛-acm-challenge-workbook:acm-挑战-工作簿

    leetcode双人赛 1 前言 ...并查集 2.5 图论 最短路 最小生成树 2.6 数论 辗转相除法 素数 快速幂 3 中级算法 3.1 二分搜索 最大化最小值 01分数规划 第k大值 最小化第k大值 其他二分搜索 3.2 常用技巧

    asp.net知识库

    使用Relations建立表之间的关系并却使用PagedDataSource类对DataList进行分页 通过作业,定时同步两个数据库 SQLSERVER高级注入技巧 利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的...

    leetcode双人赛-C:acm-挑战-工作簿

    leetcode双人赛 1 前言 ...并查集 2.5 图论 最短路 最小生成树 2.6 数论 辗转相除法 素数 快速幂 3 中级算法 3.1 二分搜索 最大化最小值 01分数规划 第k大值 最小化第k大值 其他二分搜索 3.2 常用技巧

    leetcode双人赛-algorithm:算法

    leetcode双人赛 1 前言 ...并查集 2.5 图论 最短路 最小生成树 2.6 数论 辗转相除法 素数 快速幂 3 中级算法 3.1 二分搜索 最大化最小值 01分数规划 第k大值 最小化第k大值 其他二分搜索 3.2 常用技巧

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己的第一个Java程序跑起来 2 教学视频:19分钟 1.1 想要用Java改变这个世界吗? 2 ...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    每章最后都给出了典型的练习题,让读者及时练习,巩固提高,并提供了参考答案 目录 第1篇 Java语言基本语法 第1章 让自己的第一个Java程序跑起来 2 教学视频:19分钟 1.1 想要用Java改变这个世界吗? 2 ...

    数据结构算法

    经典算法题每日演练——第十五题 并查集 经典算法题每日演练——第十四题 Prim算法 经典算法题每日演练——第十三题 赫夫曼树 经典算法题每日演练——第十二题 线段树 经典算法题每日演练——第十一题 Bitmap算法 ...

    webx3框架指南PDF教程附学习Demo

    该文档为官方webx框架文档,对webx进行了全面的讲解,非常实用,并附学习的Demo 为什么要用Webx而不是其它的开源框架? 现在有很多Java的Web框架可供选择,并且它们也都是免费的。例如: • Struts • Webwork • ...

    php网络开发完全手册

    15.3.7 结果集的分页 248 15.3.8 用户动态添加记录 249 15.3.9 用户动态更新记录 251 15.3.10 用户动态删除记录 253 15.4 使用PHP获取MySQL数据库的信息 255 15.4.1 获取数据库的信息 255 15.4.2 获取表的信息 256 ...

    疯狂JAVA讲义

    学生提问:老师,我想学习Java编程,到底是学习Eclipse好呢,还是学习JBuilder好呢? 21 1.9 本章小结 22 本章练习 22 第2章 理解面向对象 23 2.1 面向对象 24 2.1.1 结构化程序设计简介 24 2.1.2 程序的三种...

Global site tag (gtag.js) - Google Analytics