集合及运算_集合的概念及运算

集合及运算_集合的概念及运算[TOC]数据结构与算法_Python_C完整教程目录:https://www.cnblogs.com/nickchen121/p/11407287.html更新、更全的《数据结构与算法》的更新网

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

数据结构与算法_Python_C完整教程目录:https://www.cnblogs.com/nickchen121/p/11407287.html

更新、更全的《数据结构与算法》的更新网站,更有python、go、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11407287.html

一、集合的表示

集合运算:交、并、补、差,判定一个元素是否属于某一集合

在上述集合运算中,我们只关心两个集合运算,为并查集:集合某元素属于什么集合。因此有一个问题——并查集问题中集合存储如何实现?

对于上述问题,我们可以用树结构表示集合,树的每个结点代表一个集合元素

例如:有以下三个整数集合

  1. S1 = {1, 2, 4, 7}
  2. S2 = {3, 5, 8}
  3. S3 = {6, 9, 10}

对于上述三个集合,我们可以使用双亲表示法(孩子指向双亲)来构造下图所示树结构:

集合及运算_集合的概念及运算

对于上述的树结构,我们可以考虑使用数组存储,存储形式如下图所示:

集合及运算_集合的概念及运算

负数表示根结点;非负数表示双亲结点的下标。

对于数组中的每个元素,我们可以使用如下所示的代码描述:

/* c语言实现 */

typedef struct{
  ElementType Data;
  int Parent;
} SetType;

# python语言实现

class TreeNode:
     def __init__(self, x):
         self.data = None
         self.parent = None

二、集合运算

2.1 集合的查运算

查找某个元素所在的集合(用根结点表示

/* c语言实现 */

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中的下标
}

2.2 集合的并运算

分别找到X1和X2两个元素所在集合树的根结点

如果它们不同根,则将其中一个根结点的父结点指针设置成另个一个根结点的数组下标

/* c语言实现 */

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; // 当X1和X2不属于同一个子集时,才需要合并
}

下图所示为集合 {1, 2, 4, 7} 和 集合 {3, 5, 8}的并运算:

集合及运算_集合的概念及运算

对于上述的两个小集合,随意选择一个根结点并无太大影响,但是对于如下图所示的两个集合,随意选择根结点则会增加未来并集的查找效率:

集合及运算_集合的概念及运算

对于上图所示的两个集合,如果要增加未来两个集合并集的查找效率,应该尽量采用小的集合合并到相对大的集合中,但是我们如何判断哪一个集合元素更多呢?

为了更高效的判断那个集合元素更多,我们可以把根结点的-1改成-7或-3,用根结点的绝对值表示集合元素的个数,即数组更改为如下图所示:

集合及运算_集合的概念及运算

其中-7表示根结点数据为1的集合有7个元素;其中-3表示根结点数据为6的集合有3个元素。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166941.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 黑盒测试用例设计 一[通俗易懂]

    黑盒测试用例设计 一[通俗易懂]简介: 总结黑盒测试用例的常用设计方法等价类划分一、方法简介1.定义把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例2.划分等价类:等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错误都是等效的。等价类划分可有两种不同的情况:有效等价类和无效等价类。(1)有效等价类是指对于程序的规格说明来说是…

    2022年6月12日
    32
  • SpringBatch概述

    SpringBatch概述1、SpringBatch简介1.1、简介根据Spring官网描述,SpringBatch是一个轻量级的、完善的批处理应用框架,旨在支持企业系统建立健壮、高效的批处理应用。然而SpringBatch不是一个调度框架,它只关注于任务的处理,如日志监控、事务、并发问题等,但是它可以与其它调度框架一起联合使用,完成相应的调度任务,如Quartz、Tivoli、Control-M等。Sprin…

    2022年5月8日
    50
  • tcp三次握手的seq和ack_tcp三次握手的第一个报文

    tcp三次握手的seq和ack_tcp三次握手的第一个报文TCP(TransmissionControlProtocol)传输控制协议TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:位码即tcp标志位,有6种标示:SYN(synchronous建立联机)ACK(acknowledgement确认)PSH(push传送)FIN(finish结束)RST(reset重置)URG(urgent紧急)Sequ…

    2022年9月27日
    2
  • pycharm2021.11.3激活教程【中文破解版】「建议收藏」

    (pycharm2021.11.3激活教程)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html6EK6WKOHUX-eyJsaWNlbnNlSWQi…

    2022年3月28日
    45
  • 损失函数loss大大总结_logloss 损失函数

    损失函数loss大大总结_logloss 损失函数1.损失函数:损失函数(lossfunction)是用来评测模型的预测值f(x)与真实值Y的相似程度,损失函数越小,就代表模型的鲁棒性越好,损失函数指导模型学习。根据损失函数来做反向传播修改模型参数。机器学习的目的就是学习一组参数,使得预测值与真值无限接近。2.softmaxloss:它是损失函数的一种,是softmax和cross-entropyloss组合而成的损失函数。先看softmax,其函数形式如下:其中zj就是某个神经网络全连…

    2022年4月19日
    116
  • ac测评题库_awing

    ac测评题库_awing杭州人称那些傻乎乎粘嗒嗒的人为 62(音:laoer)。杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。不吉利的数字为所有含有 4 或 62 的号码。例如:62315,73418,88914 都属于不吉利号码。但是,61152 虽然含有 6 和 2,但不是 连号,所以不属于不吉利数字之列。你的任务是,对于每次给出的一个牌照号区间 [n,m],推断出交管局今后又要实际上给多少辆新的士车上牌

    2022年8月9日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号