在上周的算法设计课程中,我们学习了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)

  1.   y←x
  2.   while p(y)≠null{寻找包含x的树的根}
  3.     y←p(y)
  4.   end while
  5.   root←y;y←x
  6.   while p(y)≠null {执行路径压缩}
  7.     w←p(y)
  8.     p(y)←root
  9.     y←w
  10.   end while
  11.   return root

  UNION(x, y):用来合并两个树,算法如下(书P83)

  1.   u←FIND(x);v←FIND(y)
  2.   if rank(u) ≦ rank(v) then
  3.     p(u)←v
  4.     if rank(u) = rank(v) then rank(v)←rank(v)+1
  5.   else p(v)←u
     
  6.   end if

  具体代码实现如下:

 1 //不相交集及union-find算法的练习
 2 public class Gather {    //声明不相交集类
 3     private int p[] = new int[50];    //存放元素父节点
 4     private int rank[] = new int[50];    //存放元素的秩
 5     public int length;        //不相交集的长度
 6     public Gather(int length)
 7     {
 8         this.length = length;
 9     }
10     //寻找指定结点
11     public int find(int n)
12     {
13         int i = n;
14         /*这里的i,n 分别对应书上算法中的y,x
15          * 同理union中的a,b对应书上算法的u,v*/
16         int root, t;
17         while(p[i]!=0)
18             //向上寻找根结点
19             i = p[i];
20         root = i;
21         i = n;        //两个指针分别指向根结点与初始结点
22         while(p[i]!=0)
23         {
24             //执行路径压缩
25             t = p[i];    //t指向i的父节点
26             p[i] = root;    //将i的父节点设为根结点
27             i = t;        //指针上移
28         }
29         return root;
30     }
31     //将两个树合并
32     public void union(int x,int y)
33     {
34         int a = find(x);
35         int b = find(y);
36         //当a的秩小于等于b的秩时,以b作为父结点
37         if(rank[a] <= rank[b])
38         {
39             p[a] = b;
40             //当a的秩等于b的秩时,b的秩+1
41             if(rank[a] == rank[b])
42                 rank[b]++;
43         }
44         else p[b] = a;    //当a的秩大于b的秩时,a作为父节点
45     }
46     //输出不相交集
47     public void dispGather()
48     {
49         System.out.print("元素值:");
50         for(int i=1;i<length;i++)
51             System.out.print(i + " ");    //输出所有元素
52         System.out.println();
53         System.out.print("父节点:");
54         for(int i=1;i<length;i++)
55             System.out.print(p[i] + " ");    //输出所有元素对应的父节点值
56         System.out.println("\n");
57     }
58 }

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)

  结果图表示如下:

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

  用图表示如下

  

转载于:https://www.cnblogs.com/sunriseblogs/p/9936774.html

算法设计:UNION-FIND算法实现相关推荐

  1. 计算机 五大算法类型,计算机算法设计五大常用算法的分析及实例.docx

    标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N] 标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N] 计算机算法设计五大常用算法的分析及实例 摘要 算 ...

  2. 算法设计之常见算法策略

    1 算法简介 1.1 算法的定义 ​ 算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作. 1.2 算法的特性 ​ 1.有穷性(Finite ...

  3. 视频教程-算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践-C/C++

    算法设计与编算法设计与编程实践---基于leetcode的企业真题库程实践 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿 ...

  4. 算法设计与分析——算法思想总结

    算法设计与分析 1.分治法 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同.递归的解这些子问题,然后将各子问题的解合并得到原问题的解. 分治法所能解 ...

  5. 算法设计与分析——算法基础初步了解

    算法的概念 算法:一个有计算步骤构成的序列,可以将一组输入值转换成相应的输出值.或可以用例解决一个明确的问题. 问题:输入及相应输出的描述: 算法的特点:确定性.可行性.输入和输出及有穷性. 正确的算 ...

  6. 算法设计与分析——算法学基础(三):渐进记号

    分类目录:<算法设计与分析>总目录 相关文章: 算法学基础(一):算法学概述 算法学基础(二):分析算法 算法学基础(三):渐进记号 第<算法学基础(二):分析算法>中定义了算 ...

  7. 计算机算法设计与分析——算法引论

    1.1 算法与程序 计算机算法 通俗定义:用计算机求解问题的方法或过程. 正式定义:算法是满足下述性质的 指令序列: 输入:有零个或多个外部量作为算法的输入 输出:至少产生一个量作为输出 确定性:组成 ...

  8. 算法设计(1)--内排序算法小结

    内排序算法 William Yi 完成于2016/10/18 Email: williamyi96@gmail.com 排序算法可以大致分为两种类型: 内排序 外排序 两者之间的区别是内排序是在内存中 ...

  9. 求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

    公元2020年5月5日,距离算法考试仅剩4天. 一.知识归纳 1.设计思想 只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改 不从整体最优考虑,所做的选择只是在某种意义上的局 ...

最新文章

  1. python 高阶函数
  2. 怎样学好python-我们应该如何学好Python?
  3. 我是怎么通过技术白手起家创业 续2
  4. java 基本的文件读写
  5. android连接usb后默认app,android – 记住USB连接,但不要启动应用程序
  6. 软件接口测试一个项目的实战,全网最全postman接口测试教程和接口项目实战~从入门到精通!!!...
  7. Html5游戏开发-145行代码完成一个RPG小Demo
  8. java中将一个字符数组赋值给另一个,两者同时变化
  9. 直接选择排序(含图解)
  10. 小米笔记本网卡驱动失效,无法联网
  11. SPSS安装多次显示请输入注册的电子邮箱时,采用的解决办法。亲测有效!
  12. linux xv命令什么意思,Linux部分命令解释(命令缩写代表什么意思)
  13. 使用python爬取图片(爬取百度图片为例)
  14. 如何做一个基于JAVA购物商城系统毕业设计毕设作品(springboot框架)
  15. 九龙证券|这一刻,资本市场进入全新时代!
  16. coward的个人简介
  17. python扫描局域网端口和ip_我想用python扫描局域网内的ip和mac地址,需要什么第三方库...
  18. 数据结构:平衡二叉树(AVL树)、树的高度
  19. 计算机写给未来自己的一段话,现实,致自己 写给自己的霸气一段话汇总73句
  20. VC++线程中不能用updatedata()的解决办法

热门文章

  1. 合作方变股东:Aurora无人车获现代汽车3千万美元投资,与大众分手
  2. 通讯录(容量不可变)
  3. 【Thinkphp 5】 整合邮箱类 phpmailer实现邮件发送
  4. 2017年安防监控中的那些核心云计算技术
  5. class() 高级用法 -- lua
  6. SmsManager#sendTextMessage的BUG
  7. linux编程综合案例
  8. 2011 IBM IIS:聚百年智慧精髓 筑最优信息架构
  9. JS中NaN、NULL、undefined、详解
  10. 求最大元最小元极大元极小元_极大元、最大元.ppt