深入探索不相交集合:链表表示与加权合并策略的实现

深入探索不相交集合:链表表示与加权合并策略的实现

  • 1. MAKE-SET 操作
    • 伪代码
    • C语言实现
  • 2. FIND-SET 操作
    • 伪代码
    • C语言实现
  • 3. UNION 操作
    • 伪代码
    • C语言实现
  • 4. 集合对象和表对象的属性
  • 5. 总结

在本文中,我们将探讨如何使用链表表示和加权合并启发式策略来实现不相交集合(Disjoint Set)的操作,包括MAKE-SET、FIND-SET和UNION。不相交集合是一种数据结构,用于处理一些元素的集合,而这些集合之间没有公共元素。这种数据结构在很多算法中都非常有用,比如在图算法中确定连通分量或者在并查集算法中。
我们将首先介绍每种操作的基本概念和伪代码表示,然后提供相应的C语言实现代码,并讨论在集合对象和表对象中所使用的属性。
在这里插入图片描述

1. MAKE-SET 操作

MAKE-SET操作是用来创建一个只包含单个元素x的集合。在链表表示中,这可以通过简单地创建一个新的节点,并将该节点的指针指向自己来完成。

伪代码

MAKE-SET(x)
1. 创建一个新节点 node
2. node 的成员设置为 x
3. node 的 next 指针指向 NULL
4. 集合对象指向 node

C语言实现

#include <stdio.h>
#include <stdlib.h>
typedef struct Node {int element;struct Node *next;
} Node;
typedef struct DisjointSet {Node *head;
} DisjointSet;
void makeSet(int x, DisjointSet *djSet) {Node *node = (Node *)malloc(sizeof(Node));node->element = x;node->next = NULL;djSet->head = node;
}

2. FIND-SET 操作

FIND-SET操作是用来找出给定元素x所在的集合的代表元素。在链表表示中,由于每个集合只有一个元素,所以FIND-SET操作直接返回该元素即可。

伪代码

FIND-SET(x)
1. 返回 x

C语言实现

int findSet(DisjointSet *djSet) {return djSet->head->element;
}

3. UNION 操作

UNION操作是用来合并两个集合的。在链表表示中,我们可以使用加权合并启发式策略,即较小集合的所有元素都链接到较大集合的末尾。

伪代码

UNION(x, y)
1. 计算 x 所在集合的成员数 size_x
2. 计算 y 所在集合的成员数 size_y
3. 如果 size_x < size_ya. 将 x 所在的链表追加到 y 所在的链表b. 更新 y 所在集合的代表为合并后的集合
4. 否则a. 将 y 所在的链表追加到 x 所在的链表b. 更新 x 所在集合的代表为合并后的集合

C语言实现

void unionSets(DisjointSet *djSet1, DisjointSet *djSet2) {Node *node1 = djSet1->head;Node *node2 = djSet2->head;if (node1->next == NULL && node2->next == NULL) {// 特殊情况:两个集合都只包含一个元素node1->next = node2;djSet2->head = node1;} else {// 通用情况:找到两个链表的尾部Node *tail1 = node1;while (tail1->next != NULL) tail1 = tail1->next;Node *tail2 = node2;while (tail2->next != NULL) tail2 = tail2->next;// 根据加权合并启发式策略,将较小集合链接到较大集合if (tail1->next == NULL) {tail1->next = node2;djSet2->head = node1;} else if (tail2->next == NULL) {tail2->next = node1;djSet1->head = node2;} else {// 比较链表长度并合并if (tail1->element < tail2->element) {tail1->next = tail2->next;tail2->next = node1;djSet1->head = djSet2->head;} else {tail2->next = tail1->next;tail1->next = node2;djSet2->head = djSet1->head;}}}
}

4. 集合对象和表对象的属性

在上述实现中,我们定义了两个结构体NodeDisjointSetNode结构体用于表示链表中的节点,它包含一个元素和一个指向下一个节点的指针。DisjointSet结构体用于表示一个集合,它包含一个指向链表头部的指针。

5. 总结

本文详细介绍了如何使用链表表示和加权合并启发式策略来实现不相交集合的MAKE-SET、FIND-SET和UNION操作。我们提供了每种操作的伪代码和C语言实现,并讨论了在集合对象和表对象中所使用的属性。这些操作是构建更复杂算法的基础,比如在图算法中确定连通分量或者在并查集算法中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3029462.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

如何防止WordPress网站内容被抓取

最近在检查网站服务器的访问日志的时候&#xff0c;发现了大量来自同一个IP地址的的请求&#xff0c;用站长工具分析确认了我的网站内容确实是被他人的网站抓取了&#xff0c;我第一时间联系了对方网站的服务器提供商投诉了该网站&#xff0c;要求对方停止侵权行为&#xff0c;…

求一个B站屏蔽竖屏视频的脚本

求一个B站屏蔽竖屏视频的脚本 现在B站竖屏竖屏越来越多了&#xff0c;手机还好点给我一个按钮&#xff0c;选择不喜欢&#xff0c;但是我一般都用网页版看视屏&#xff0c;网页版不给我选择不喜欢的按钮&#xff0c;目测大概1/4到1/3的视频都是竖屏视频。 目前网页版唯一的进…

H5 处理点击元素高亮、自定义按钮、去除焦点边框

1、设置移动设备上点击元素时出现的高亮颜色 *{-webkit-tap-highlight-color: transparent; }2、如果你想要自定义按钮的样式&#xff0c;你可以使用 -webkit-appearance: none; 来移除按钮的默认样式 .button {-webkit-appearance: none;appearance: none; /* 兼容性更好的通…

转行网络安全的重要建议,助你顺利入门

目录 为什么写这篇文章 为什么我更合适回答这个问题 先问自己3个问题 1.一定要明确自己是否是真喜欢&#xff0c;还是一时好奇。 2.自学的习惯 3.选择网安、攻防这行的目标是什么&#xff1f; 确认无误后&#xff0c;那如何进入这个行业&#xff1f; 1.选择渗透测试集中…

推荐 6 个超好用的 iterm2 zsh 插件

大家好啊&#xff0c;今天给大家分享几个我日常使用的 iterm2 插件&#xff0c;每一个都很有用&#xff0c;希望能给帮助你提高使用命令行的效率&#xff5e; zsh-autosuggestions 插件地址&#xff1a;https://github.com/zsh-users/zsh-autosuggestions 效果展示 当你输入…

鸿蒙开发接口Ability框架:【@ohos.application.Want (Want)】

Want Want模块提供系统的基本通信组件的能力。 说明&#xff1a; 本模块首批接口从API version 8 开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import Want from ohos.application.Want; 开发前请熟悉鸿蒙开发指导文档&#xff1…

【强训笔记】day18

NO.1 思路&#xff1a;双指针模拟。to_string将数字转化为字符。 代码实现&#xff1a; class Solution { public:string compressString(string param) {int left0,right0,nparam.size();string ret;while(right<n){while(right1<n&&param[right]param[right…

TikTok自动评论、回复的脚本怎么制作?

在当今数字化的时代&#xff0c;社交媒体平台如TikTok已经成为人们日常生活的一部分&#xff0c;为了更有效地在TikTok上进行营销或互动&#xff0c;许多用户和企业开始寻找自动化工具&#xff0c;如自动评论和回复的脚本&#xff0c;以节省时间并提高效率。 本文将科普如何制…

2024 年 数维杯(A题)大学生数学建模挑战赛 | 多源机会信号建模| 数学建模完整代码+建模过程全解全析

2024数维杯数学建模A题B题C题思路模型代码&#xff08;开赛后第一时间更新&#xff09;及时留意关注哦 https://mbd.pub/o/bread/ZpWakpdq https://mbd.pub/o/bread/ZpWakpdq 2024数维杯数学建模A题B题C题思路模型代码&#xff08;开赛后第一时间更新&#xff09;及时留意关注…

02.文件IO

文件描述符 表述打开的文件的 它是open函数的返回值&#xff0c;一个进程启动之后&#xff0c;会默认打开3个文件标识符 0标准输入&#xff0c;1标准输出&#xff0c;2标准错误 新的打开的文件返回文件描述符表中未使用过的最小的文件描述符 open函数 用来打开或者新建一个文件…

YOLOv5独家原创改进: 通用倒瓶颈(UIB)搜索块结合C3二次创新 | 轻量化之王MobileNetV4

💡💡💡创新点:轻量化之王MobileNetV4 开源 | Top-1 精度 87%,手机推理速度 3.8ms,原地起飞! 最主要创新:引入了通用倒瓶颈(UIB)搜索块,这是一个统一且灵活的结构,它融合了倒瓶颈(IB)、ConvNext、前馈网络(FFN)以及一种新颖的额外深度可分(ExtraDW)变体技…

C++|二叉搜索树

一、二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根结…

每天五分钟深度学习:数学中的极值

本文重点 在数学领域中,极值是一个极其重要的概念,它不仅在纯数学理论研究中占据核心地位,而且在工程、物理、经济等实际应用领域也发挥着不可替代的作用。极值问题涉及函数的最大值和最小值,是微积分学中的一个基本问题。本文旨在详细介绍数学中的极值概念、性质、求解方…

嫁接打印的技术要点

所谓嫁接打印&#xff0c;是一种增减材混合制造的方式。它将已成形的模具零件当作基座&#xff0c;在此基础上“生长”出打印的零件。其中基座通常采用传统加工方式制造&#xff0c;而打印部分则使用专用的金属粉末&#xff0c;通过 3D 打印技术成型。 嫁接打印之所以备受欢迎&…

Golang面向对象编程(一)

文章目录 结构体基本介绍结构体定义方式创建结构体变量结构体内存对齐结构体类型转换字段的Tag标签 方法基本介绍方法的定义和调用方法调用的传参机制String方法 结构体 基本介绍 基本介绍 Go支持面向对象编程特性&#xff0c;包括封装、继承和多态&#xff0c;但Go中没有类&a…

Certbot免费证书的安装,使用,自动续期

首先你得先确认你得linux是那个操作系统&#xff0c;可以用这几个命令试一下。两个都可以试试 cat /etc/os-releaseuname -a然后看是Certbot得安装&#xff1a; CentOS: yum update yum install certbot -y Debian&#xff1a; apt update apt install certbot -y 有的云…

速卖通ip地址会相互影响吗?如何防止账号关联?

在跨境电商行业&#xff0c;大部分平台都是不允许一个卖家操作多个店铺的&#xff0c;如果被平台检测出账户关联&#xff0c;可能会被封店。在速卖通平台&#xff0c;会通过IP地址来判断是否经营多个账号吗?IP地址会使店铺相互影响吗? 一、速卖通IP地址会关联吗? 首先各位卖…

利用智谱清言使用python编写代码获取简单ecupl网站信息

首先提问&#xff1a; 使用python搜取https://xxgk.ecupl.edu.cn/2024/0509/c1334a213900/page.htm的内容 得到代码如下&#xff0c;能直接使用&#xff1a; import requests from bs4 import BeautifulSoup# 目标网页URL url https://xxgk.ecupl.edu.cn/2024/0509/c1334a21…

SpringBoot 实现 RAS+AES 自动接口解密

接口安全老生常谈了 目前常用的加密方式就对称性加密和非对称性加密&#xff0c;加密解密的操作的肯定是大家知道的&#xff0c;最重要的使用什么加密解密方式&#xff0c;制定什么样的加密策略&#xff1b;考虑到我技术水平和接口的速度&#xff0c;采用的是RAS非对称加密和AE…

Linux增加硬盘分区并挂载(各个云平台操作)

第一部分&#xff0c;增加硬盘 1.购买硬盘并选择云服务器 输入lsblk 命令后即可看到刚刚添加的硬盘了 vdb就是新添加的硬盘名称了 第二部分 对硬盘进行分区处理 然后对新建磁盘进行分区 输入命令fdisk /dev/vdb 输入lsblk -f 命令查看刚刚建好的分区(看到多余的sdc不用在意…