本次笔记内容:
5.3.1 集合的表示及查找
5.3.2 集合的并运算

文章目录

  • 集合的表示
    • 并查集
    • 并查集问题中的存储实现
  • 集合的并运算
    • 直接实现的方法
    • Union函数更好的思想

集合的表示

  • 集合的运算包括:交、并、补、差、判定一个元素是否属于某一集合。

并查集

  • 并查集:集合并、查某元素属于什么集合。
  • 并查集问题的现实中例子:
    有10台电脑{1,2,3,…,9,10},已知下列电脑之间已经实现了连接:
    1和2、2和4、3和5、4和7、5和8、6和9、6和10,问:2和7之间,5和9之间是否是连通的?

上例解决思路:

  1. 将10台电脑看成10个集合{1},{2},{3},…,{9},{10};
  2. 已知一种连接“x和y”,就将x和y对应的集合合并;
  3. 查询“x和y是否是连通的”就是判别x和y是否属于同一集合。

并查集问题中的存储实现

  • 可以用树结构表示集合,树的每个结点代表一个集合元素。

如上,使用双亲表示法。双亲的下标即代表集合。

如上图,2的父结点为1,1的下标为0,因此Parent为1;对于没有父结点的根结点,其Parent为-1。

typedef struct
{ElementType Data;int Parent;
} SetType;int Find(SetType s[], ElementType X)
{/* 在数组S中查找值为X的元素所属的集合 *//* MaxSize是全局变量,为数组S的最大长度 */int i;for (i = 0; i < MaxSize && S[i].Data != X; i++);if (i > -MaxSize)return -1; /* 未找到X,返回-1 */for (; S[i].Parent >= 0; i = S[i].Parent);return i; /* 找到X所属集合,返回树根结点在数组S中的下标 */
}

集合的并运算

  • 分别找到X1和X2两个元素所在集合树的根节点;
  • 如果他们不同根,则将其中一个根结点的父结点指针设置成另一个根结点的数组下标。

直接实现的方法

void Union(SetType S[], ElementType X1, ElementType X2)
{int Root1, Root2;Root1 = Find(S, X1);Root2 = Find(S, X2);if (Root1 != Root2)S[Root2].Parent = Root1;
}

Union函数更好的思想

上述实现可能造成树越来越高,降低查找效率。因此,为了改善合并以后的查找性能,可以采用小的集合合并到相对大的集合中的办法。

使用根结点表示集合元素数量即可。

【数据结构笔记17】集合的表示、双亲表示法、并查集、集合的并运算相关推荐

  1. 2021秋季《数据结构》_EOJ 1063.树的双亲存储法(parent+child / parent)

    题目 前面介绍了树的链式存储结构,那么如何用顺序存储来存储一棵树呢?在顺序存储时,我们除了存储每个结点值外,还要存储树中结点与结点之间的逻辑关系(即双亲与孩子结点之间的关系).下面介绍树的双亲存储法. ...

  2. 数据结构——树|N叉树之孩子双亲表示法——顺序存储结构+链表

    N叉树之孩子双亲表示法 左边是表头结构,相当于一个顺序存储,开始只做了一个顺序结构,发现诸多不便之处,随即开始孩子双亲表示法的学习,这个表示法,需要定义三个结构: 孩子结构 表头结构 树的结构 按理说 ...

  3. NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表

    系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...

  4. 并查集——集合(洛谷 P1621)

    题目选自洛谷P1621 一道并查集类型的算法题,基本框架不变,就是合并的时候怎么合并,合并哪些数? 筛出素数之后找出在 'p~b' 范围内的素数 然后枚举a~b之间的数,合并他们 最后看看那些数的祖先 ...

  5. 面试题 17.07. 婴儿名字 ( 字符标志 并查集 )

    面试题 17.07. 婴儿名字 字符串并查集: 721. 账户合并 ( 并查集 ) 解题思路: 首先通过哈希表建立并查集,哈希表的键值对都是字符串,然后将一个相连的并查集合并: 利用一个哈希表进行计数 ...

  6. CodeForces - 722C Destroying Array (并查集/集合的插入和删除)

    原题链接:https://vjudge.net/problem/511814/origin Description: You are given an array consisting of n no ...

  7. 数据结构与算法A实验六图论---7-9 最短路径(并查集Dijkstra)

    给定一个有N个顶点和E条边的无向图,顶点从0到N−1编号.请判断给定的两个顶点之间是否有路径存在.如果存在,给出最短路径长度. 这里定义顶点到自身的最短路径长度为0. 进行搜索时,假设我们总是从编号最 ...

  8. 【Python数据结构】——并查集的实现(查找、合并、集合、实例)

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2021/7/30 23:12 # @Author : @linlianqin # @S ...

  9. [重修数据结构0x03]并查集、堆、优先队列(2021.8.11)

    前言 在做遍历的题目的时候,发现掌握一些特殊的数据结构和技巧有时对解决题目有着决定性的作用,不可不学.因此特地拿出来两天学习一下并查集.堆.优先队列.以后有更多思考和感悟再加补充吧.内容来自算法笔记, ...

最新文章

  1. C# 之String以及浅拷贝与深拷贝
  2. 汇编小程序---计算十以内两个数的相加
  3. 517. 超级洗衣机
  4. arcgis将小于0的数值设置成0.01
  5. HTML+CSS+JS实现 ❤️透明的水滴文字背景特效❤️
  6. Django REST framework API开发
  7. mysql正则表达式匹配非_MySQL的正则表达式
  8. MIT计算机专业本硕连读几年,2020年麻省理工学院读研要多久
  9. Bzoj 2683: 简单题(CDQ分治)
  10. 承接各类软件开发项目
  11. 【TensorFlow-windows】(三) 多层感知器进行手写数字识别(mnist)
  12. 计算机编程的21条规律 -- 转
  13. xp php环境搭建 iis,Windows XP环境下快速配置IIS+PHP详细过程
  14. proteus——rs-232双机通讯
  15. 【学习笔记】成功解决:(字体问题)Package fontspec Error: The font “STXingkai“ cannot be found. \makecover
  16. 云计算怎么学?学习云计算有什么用?
  17. iOS - Safe iOS 加密安全
  18. 如何使用Python还原村上春树笔下经典的那句“我爱你像爱春天的小熊”
  19. IDEA怎么查看现在的项目使用的JDK版本? 2016年4月19日22:51
  20. 关于计算机物联网的文章,物联网认识论文3000字_关于物联网认识论文3000字_物联网导论论文3000字...

热门文章

  1. 【PL/SQL】PL/SQL语言基础
  2. SQL Server复制需要有实际的服务器名称才能连接到服务器 错误解决方案
  3. 执行存储过程SQL Server阻止了对组件xp_cmdshell过程的解决方案
  4. 如何解决”ArcGIS Server Site is currently being configured by another administrative operation“的问题
  5. web app开发利器 - iscroll4 解决方案
  6. windows远程桌面无法拷贝文件的问题与解决方法
  7. 取消链接文件失败。 我应该再试一次吗?
  8. Win10电脑如何合并磁盘分区
  9. Android运行时权限,设置帮助类BaseActivity;电话权限,短信权限,
  10. mybatis动态SQL配置文件