《数据结构与算法分析:C语言描述》复习——第八章“并查集”——并查集
2014.06.18 14:16
简介:
“并查集”,英文名为“union-find set”,从名字就能看出来它支持合并与查找功能。另外还有一个名字叫“disjoint set”,中文名叫不相交集合。可能我们倾向于用最短的名字,所以就出现了“并查集”翻译为“disjoint set”的情况。并查集是一种树形结构,但与之前讲的树不同的是,这里的树节点只记录父节点,因此是一对一的,就可以用数组来表示并查集。
图示:
并查集可以认为是一个“森林”,也就是多棵树:
  
既然是并查集,先看看合并3和5之后结果如何:
  
那么3和5岂不是父子关系了?不是。我们关心的不是谁是父谁是子,而是3和5现在在一起了。下面这样效果是一样的:
  
这个看起来不像树形结构啊?那就来个节点个数更多的例子:
  
再看看查找操作:
  
这样的查找操作不改变树的形状,自底向上,复杂度必然是O(H),也就是和树的高度成正比。有什么坏处呢?
  
路径压缩可以通过让树变得更扁来降低高度,从而加速查找操作。首先仍然是查找:
  
  然后依次把沿路的所有节点直接挂到根节点上:
  
  
  
图片占的篇幅更少,显然是因为树变矮了。现在查找操作只需要O(1)时间了。
那么并查集有什么用呢?通俗地说,是用来判断一群人中,谁和谁是一伙儿的,谁和谁不是。不通俗地说,可以看看“等价关系”、“等价类”的一些集合论的资料,从中寻找一些理论支持。
在此给出一道用并查集解决的ZOJ简单题:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2833
实现:
// My implementation for disjoint set.
#include <vector>
using namespace std; int findRoot(const vector<int> &dj, int x)
{
int k, r; r = x;
while (r != dj[r]) {
r = dj[r];
} k = x;
while (k != r) {
x = dj[x];
dj[k] = r;
k = x;
} return r;
} void unionSet(vector<int> &dj, int x, int y)
{
int n = (int)dj.size(); if (x == y) {
return;
} dj[x] = y;
findRoot(x);
} int main()
{
return ;
}
《数据结构与算法分析:C语言描述》复习——第八章“并查集”——并查集的更多相关文章
- 数据结构与算法分析——C语言描述 第三章的单链表
		
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
 - 最小正子序列(序列之和最小,同时满足和值要最小)(数据结构与算法分析——C语言描述第二章习题2.12第二问)
		
#include "stdio.h" #include "stdlib.h" #define random(x) (rand()%x) void creat_a ...
 - C语言学习书籍推荐《数据结构与算法分析:C语言描述(原书第2版)》下载
		
维斯 (作者), 冯舜玺 (译者) <数据结构与算法分析:C语言描述(原书第2版)>内容简介:书中详细介绍了当前流行的论题和新的变化,讨论了算法设计技巧,并在研究算法的性能.效率以及对运行 ...
 - 《数据结构与算法分析——C语言描述》ADT实现(NO.00) : 链表(Linked-List)
		
开始学习数据结构,使用的教材是机械工业出版社的<数据结构与算法分析——C语言描述>,计划将书中的ADT用C语言实现一遍,记录于此.下面是第一个最简单的结构——链表. 链表(Linked-L ...
 - 《数据结构与算法分析-Java语言描述》 分享下载
		
书籍信息 书名:<数据结构与算法分析-Java语言描述> 原作名:Data Structures and Algorithm Analysis in Java 作者: 韦斯 (Mark A ...
 - 《数据结构与算法分析:C语言描述_原书第二版》CH3表、栈和队列_reading notes
		
表.栈和队列是最简单和最基本的三种数据结构.基本上,每一个有意义的程序都将明晰地至少使用一种这样的数据结构,比如栈在程序中总是要间接地用到,不管你在程序中是否做了声明. 本章学习重点: 理解抽象数据类 ...
 - 读书笔记:《数据结构与算法分析Java语言描述》
		
目录 第 3 章 表.栈和队列 3.2 表 ADT 3.2.1 表的简单数组实现 3.2.2 简单链表 3.3 Java Collections API 中的表 3.3.1 Collection 接口 ...
 - 【数据结构与算法分析——C语言描述】第二章总结 算法分析
		
算法 算法(algorithm)是为求解一个问题需要遵循的.被清楚地指定的简单指令的集合. 数学基础 四个定义: 1.大O表示法: 如果存在正常数 c 和 n0 使得当 N ≥ n0时,T(N) ≤ ...
 - 【数据结构与算法分析——C语言描述】第一章总结 引论
		
这一章主要复习了一些数学知识,像指数.对数.模运算.级数公式:还有2种证明方法,归纳假设法和反证法.所幸以前学过,重新拾捡起来也比较轻松. 简要地复习了递归,提出了编写递归例程的四条基本法则: 基准情 ...
 - 《数据结构与算法分析——C语言描述》ADT实现(NO.05) : 散列(Hash)
		
散列(Hash)是一种以常数复杂度实现查找功能的数据结构.它将一个关键词Key,通过某种映射(哈希函数)转化成索引值直接定位到相应位置. 实现散列有两个关键,一是哈希函数的选择,二是冲突的处理. 对于 ...
 
随机推荐
- Android(java)学习笔记68:使用proguard混淆android代码
			
1. 当前是有些工具比如apktool,dextojar等是可以对我们android安装包进行反编译,获得源码的.为了减少被别人破解,导致源码泄露,程序被别人盗取代码,等等.我们需要对代码进行混淆,a ...
 - 遍历ResultSet,行列要从1开始
			
为什么遍历ResultSet,行列要从1开始. 因为Resultset的第一行的第一列都是空的,要用rs.next()到第一行才能进行读取. Statement stmt=null; ResultS ...
 - Linux下vim操作的一些使用技巧
			
以下均为个人在编程时对vim编辑器的一些心得,大神请指点,新手可以看过来 1.多文本编辑 vim -On/-on filename_1 … filename_n 如上所示,在要编辑的文件名前加上“-O ...
 - Python函数及参数
			
## 函数 - 函数是代码的一种组织形式,一般一个函数完成一个特定功能 - 函数需要先定义后使用 - 函数的定义 def func_name(参数): func_body ... return fun ...
 - 实用jquery插件
			
jquery toast 一个弹窗插件 jquery.form.min.js 一个Ajax表单插件
 - JavaScript通过HTML的class来获取HTML元素的方法总结
			
对于js来说,我想每一个刚接触它的人都应该会抱怨:为什么没有一个通过class来获取元素的方法.尽管现在高版本的浏览器已经支持getElementsByClassName()函数,但是对于低版本浏览器 ...
 - python之微信好友统计信息
			
需要安装库:wxpy 代码如下: from wxpy import Bot,Tuling,embed,ensure_one bot = Bot(cache_path=True) #获取好友信息 bot ...
 - exec族函数
			
作用 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离.这样的好处是有更多的余地对两种操作进行管理. 当我们创建了一个进程之后,通常将子进程替换成新的进程映象,这可以用 ...
 - python使用网易邮箱发邮件
			
# -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText import email.mime.multip ...
 - 笔记-python异常信息输出
			
笔记-python异常信息输出 1. 异常信息输出 python异常捕获使用try-except-else-finally语句: 在except 语句中可以使用except as e,然后通 ...