算法设计:UNION-FIND算法实现
在上周的算法设计课程中,我们学习了UNION-FIND算法,该算法用来对不相交集进行查询与合并操作,但任何优秀的算法都必须要用实际的代码来进行实现,接下来我们就来看看具体的代码实现
1. 不相关集数据结构的存储方式
一般来说,对于一个不相关集A = {1, 2, ..., n} 来说,我们使用两个长度为n的数组p[] 和 rank[] 来表示。
p[] 中,数组下标表示所对应的元素,数组值表示该元素对应的父节点,没有父节点时值为0,如a[1] = 2 便表示元素1的父节点为2
rank[] 表示数组元素的秩,一般用来表示该节点的高度,初始值全为零。

上图的不相交集结构用数组表示为下图:

2. UNION-FIND算法及其代码实现
UNION-FIND算法包含两个方法FIND(x) 与 UNION(x, y)
FIND(x):用来寻找包含x的根,算法如下(书P83)
- y←x
- while p(y)≠null{寻找包含x的树的根}
- y←p(y)
- end while
- root←y;y←x
- while p(y)≠null {执行路径压缩}
- w←p(y)
- p(y)←root
- y←w
- end while
- return root
UNION(x, y):用来合并两个树,算法如下(书P83)
- u←FIND(x);v←FIND(y)
- if rank(u) ≦ rank(v) then
- p(u)←v
- if rank(u) = rank(v) then rank(v)←rank(v)+1
- else p(v)←u
- end if
具体代码实现如下:
//不相交集及union-find算法的练习
public class Gather { //声明不相交集类
private int p[] = new int[50]; //存放元素父节点
private int rank[] = new int[50]; //存放元素的秩
public int length; //不相交集的长度
public Gather(int length)
{
this.length = length;
}
//寻找指定结点
public int find(int n)
{
int i = n;
/*这里的i,n 分别对应书上算法中的y,x
* 同理union中的a,b对应书上算法的u,v*/
int root, t;
while(p[i]!=0)
//向上寻找根结点
i = p[i];
root = i;
i = n; //两个指针分别指向根结点与初始结点
while(p[i]!=0)
{
//执行路径压缩
t = p[i]; //t指向i的父节点
p[i] = root; //将i的父节点设为根结点
i = t; //指针上移
}
return root;
}
//将两个树合并
public void union(int x,int y)
{
int a = find(x);
int b = find(y);
//当a的秩小于等于b的秩时,以b作为父结点
if(rank[a] <= rank[b])
{
p[a] = b;
//当a的秩等于b的秩时,b的秩+1
if(rank[a] == rank[b])
rank[b]++;
}
else p[b] = a; //当a的秩大于b的秩时,a作为父节点
}
//输出不相交集
public void dispGather()
{
System.out.print("元素值:");
for(int i=1;i<length;i++)
System.out.print(i + " "); //输出所有元素
System.out.println();
System.out.print("父节点:");
for(int i=1;i<length;i++)
System.out.print(p[i] + " "); //输出所有元素对应的父节点值
System.out.println("\n");
}
}
1. 数据测试
写好了代码,我们需要用一些数据来测试一下我们的代码,我们采用书上P83的例4.4作为实例。
例4.4 设S = {1, 2, ..., 9},考虑用下面的合并和寻找序列:UNION(1, 2), UNION(3,4), UNION(5,6), UNION(7,8), UNION(2,4), UNION(8,9), UNION(6,8), FIND(5), UNION(4,8), FIND(1)

创建一个Gather对象并输出其初始状态(需要注意的是,我们的算法是下标从1开始的,而java中数组是从下标0开始的,所以我们定义长度为n的不相交集时,输入数字必须为n+1)

结果图表示如下:


由于篇幅关系,我们就不像书上和代码上那样分步看结果了,直接跳到最后的输出:

用图表示如下:

算法设计:UNION-FIND算法实现的更多相关文章
- 南大算法设计与分析课程复习笔记(1) L1 - Model of computation
一.计算模型 1.1 定义: 我们在思考和处理算法的时候是机器无关.实现语言无关的.所有的算法运行在一种“抽象的机器”之上,这就是计算模型. 1.2 种类 图灵机是最有名的计算模型,本课使用更简单更合 ...
- OOP: One pont of view of OOP与基于算法设计的区别
..摘自<C++网络编程 卷1:运用ACE和模式消除复杂性> <C++ Network Programming Volume 1 Mastering Complexity with ...
- Python数据结构与算法设计总结篇
1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python]( http://interactivepython.org/courselib/static ...
- 算法设计和数据结构学习_5(BST&AVL&红黑树简单介绍)
前言: 节主要是给出BST,AVL和红黑树的C++代码,方便自己以后的查阅,其代码依旧是data structures and algorithm analysis in c++ (second ed ...
- Data Structure 之 算法设计策略
1. 穷举法 基本思想:列举问题的所有可能解,并用约束条件逐一进行判定,找出符合约束条件的解. 穷举法的关键在于问题的可能解的列举和可能解的判别. 例如:凑数问题 2. 递归技术 定义:直接或间接调用 ...
- IK分词算法设计总结
IK分词算法设计思考 加载词典 IK分词算法初始化时加载了“敏感词”.“主词典”.“停词”.“量词”,如果这些词语的数量很多,怎么保证加载的时候内存不溢出 分词缓冲区 在分词缓冲区中进行分词操作,怎么 ...
- 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划
由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...
- 算法设计手冊(第2版)读书笔记, Springer - The Algorithm Design Manual, 2ed Steven S.Skiena 2008
The Algorithm Design Manual, 2ed 跳转至: 导航. 搜索 Springer - The Algorithm Design Manual, 2ed Steven S.Sk ...
- 【算法设计与分析基础】24、kruskal算法详解
首先我们获取这个图 根据这个图我们可以得到对应的二维矩阵图数据 根据kruskal算法的思想,首先提取所有的边,然后把所有的边进行排序 思路就是把这些边按照从小到大的顺序组装,至于如何组装 这里用到并 ...
随机推荐
- Php发送post请求方法
因为自己时常用到 所以还是发布一下吧 /** * 发送post请求 * @param string $url 请求地址 * @param array $post_data post键值对数据 * @r ...
- HTML5新增和废弃的标签
一.废弃的标签 以下的 HTML 4.01 元素在HTML5中已经被删除,虽然浏览器为了兼容性考虑都还支持这些标签,但建议使用新的替代标签,矛盾的是老浏览器对新标签的支持度又不够,视项目的受众对象而定 ...
- linux块设备缓存bcache
1 Bcache介绍Bcache是一种缓存技术,它是根据SSD的特性设计的,由于SSD的随机读写速度要比普通硬盘的随机读写快N多倍,但是一般SSD的容量小且贵,当然土豪除外,所以我们可以综合SSD的读 ...
- mysql分页(ajax)
分页有多种方式,mysql的limit是个不错的选择,通过ajax实现异步刷新,将当前页数和每页数量传入后台即可 1. 首先后台要拿到总记录数和所需显示数据列表,所以要分别写两个sql方法 我这里是通 ...
- 什么是AOP-面向交叉业务编程
一.AOP(Aspect-oriented programming,面向切面编程): 什么是AOP? 定义:将程序中的交叉业务逻辑提取出来,称之为切面.将这些切面动态织入到目标对象,然后生成一个代理对 ...
- 【洛谷】【动态规划/二维背包】P1855 榨取kkksc03
[题目描述:] ... (宣传luogu2的内容被自动省略) 洛谷的运营组决定,如果...,那么他可以浪费掉kkksc03的一些时间的同时消耗掉kkksc03的一些金钱以满足自己的一个愿望. Kkks ...
- 1818: [Cqoi2010]内部白点
Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1394 Solved: 625 [Submit][Status][Discuss] Descriptio ...
- 2743: [HEOI2012]采花
Description 萧芸斓是Z国的公主,平时的一大爱好是采花.今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花 .花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一 ...
- 【转】Android中获取应用程序(包)的信息-----PackageManager的使用(一)
转载请注明出处:http://blog.csdn.net/qinjuning 本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占 ...
- [luogu3941] 入阵曲
题面 话说题目前面的那首诗还挺有意境的啊哈哈. 可能今天要把中文的标点都换成英文的了, 先熟悉一下吧... 好了, 进入正题, 求一个矩阵内有多少个子矩阵满足这个子矩阵的和模k为零.看到矩 ...