学习笔记分享-进阶数据结构与算法-图-并查集-优化

前言

  • 图片上面的personal表示只有图片上面的一行语句是解释图片内容的、local表示这个图片所在标题下的所有语句都是解释图片内容的、global表示有多个标题下的所有语句都是解释图片内容的
  • 我是一名大二的学生,学了差不多一年java技术栈了,想记录一下自己对知识点的心得,目前还是个小白,期望大佬们可以指出我笔记中的不足之处、对知识点的认知错误、笔记结构的混乱等
  • 这些图片内容都是在观看黑马课程时的视频截图

文章目录

  • 前言
  • 学习了 p96-p97(进阶数据结构与算法-图-并查集-优化)
    • 1. 优化目的
    • 2. 极端场景复现
    • 3. 优化操作-对 find 方法进行优化
    • 4. 优化操作-对 union 方法进行优化
      • 4.1 优化思路
      • 4.2 代码实现

学习了 p96-p97(进阶数据结构与算法-图-并查集-优化)

1. 优化目的

  • 为了使查找指定顶点所属集合的效率更高

2. 极端场景复现

  • 顶点关系: ',‘前的数字表示顶点编号,’,'后的数字表示当前顶点所属集合的老大顶点的编号
0,0
1,0
2,1
3,2
4,3
5,4
6,5
  • 如果我们想查看 6 号顶点所属集合,需要经过多次递归才能得到结果,这其中可以进行一些优化操作
  • local

3. 优化操作-对 find 方法进行优化

  • 在递归查找的情况下,只有找到了集合老大的索引才会开始归
  • 这个集合老大的索引会贯穿整个递归调用链,只要是在这个递归调用链中的顶点,他们的集合老大一定都是递归方法的结果,据此可以更新这些顶点的老大为递归方法的结果
  • local

4. 优化操作-对 union 方法进行优化

4.1 优化思路

  • 在两个集合老大中选择出一个新的老大的依据是选择集合中顶点个数多的集合老大为新的集合老大
    • 原因是这样递归查找次数比较均衡,比如集合 A(老大是 A,另一个顶点是 C)有两个顶点和集合 B 只有一个顶点,集合 A 和集合 B 的合并后的老大应该选择 A,这样合并前找顶点 C 所属集合只需递归一次,合并后找顶点 C 所属集合也是只需要递归一次,如果集合 A 和集合 B 合并后的老大选择 B,那么合并后找顶点 C 所属集合就需要递归两次了

4.2 代码实现

  • 首先准备一个数组,用于存储集合的顶点个数,在构造方法中根据顶点个数进行初始化即可,数组元素默认值为 1
    • 数组索引表示集合老大的索引值
    • 数组索引处元素值表示集合中的顶点个数
  • personal
  • 在 union 方法中,x、y 都表示集合老大的索引,据此得到这两个集合的顶点个数,让顶点个数多的集合的集合老大成为新集合的老大,并修改这个新集合老大的集合个数为原先两个集合个数之和
  • local

你可能感兴趣的:(#,学习笔记分享-数据结构与算法,学习,笔记)