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

news2024/11/27 16:31:18

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

  • 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_y
    a. 将 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://www.coloradmin.cn/o/1671049.html

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

相关文章

研究生通用学术英语写作(刘美岩)教材电子版分享

研究生通用学术英语写作电子版资源分享 本着开源的思想&#xff0c;为了实现互通有无&#xff0c;诸位需要研究生通用学术英语写作电子版资源的朋友可以直接微信关注下面公众号&#xff0c;或者手动搜索莲花百货铺&#xff0c;在公众号中直接输入书名就可获得网盘链接&#xff…

运维必备 | 《K8s故障排查手册》,强烈建议收藏!!

新手在使用K8s时经常出现各种故障&#xff0c;有些故障不知道背后原因&#xff0c;迟迟不能解决。今天就分享一份大佬总结的K8s常见问题故障排查手册&#xff0c;超级实用&#xff0c;运维及K8s使用者一定要收藏备用&#xff01; 简介 这份《K8s故障排查手册》&#xff0c;共…

电子作业指导书系统如何提升医疗设备工厂的生产效率

在医疗设备工厂中&#xff0c;电子作业指导书&#xff08;ESOP&#xff09;正逐渐成为提升生产效率的关键因素。 一、电子作业指导书系统提供了即时可得的准确信息。 电子作业指导书系统与传统的纸质作业指导书相比&#xff0c;员工可以在工作现场通过电子设备随时查阅最新、最…

kubeflow文档-介绍与架构

1. kubeflow介绍 Kubeflow项目致力于使机器学习&#xff08;ML&#xff09;工作流在Kubernetes上的部署变得简单、可移植和可扩展。目标不是重新创建其他服务&#xff0c;而是提供一种直接的方法&#xff0c;将ML的开源系统部署到不同的基础设施中。无论在哪里运行Kubernetes&a…

【C++初阶】string模拟实现

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

Python 求高斯误差函数 erf 和 erfc

文章目录 Part.I IntroductionPart.II 概念定义Chap.I 误差函数 erfChap.II 误差函数补 erfc Part.II 求值与绘图Chap.I 求取方式Chap.II 绘图 Reference Part.I Introduction 本文将对误差函数&#xff08;ERror Function, ERF&#xff09;进行简单的介绍&#xff0c;并探索如…

R语言:GSEA分析

#安装软件包 > if (!requireNamespace("BiocManager", quietly TRUE)) install.packages("BiocManager") > BiocManager::install("limma") > BiocManager::install("org.Hs.eg.db") > BiocManager::install("…

吴恩达机器学习笔记:第 10 周-17大规模机器学习(Large Scale Machine Learning)17.1-17.2

目录 第 10 周 17、 大规模机器学习(Large Scale Machine Learning)17.1 大型数据集的学习17.2 随机梯度下降法 第 10 周 17、 大规模机器学习(Large Scale Machine Learning) 17.1 大型数据集的学习 如果我们有一个低方差的模型&#xff0c;增加数据集的规模可以帮助你获得更…

8种常见的CMD命令

1.怎么打开CMD窗口 步骤1&#xff1a;winr 步骤2&#xff1a;在弹出的窗口输入cmd&#xff0c;然后点击确认&#xff0c;就会出现一个cmd的窗口 2.CMD的8种常见命令 2.1盘符名称冒号 说明&#xff1a;切换盘的路径 打开CMD窗口这里默认的是C盘的Users的27823路径底下&#xf…

生产制造行业推拉式生产的复合应用

一、案例分析&#xff08;汽配行业&#xff09; 重点&#xff1a; 1. MTO/MTS 与 PUSH/PULL 有关系但是不是充分关系 2. MTO/MTS 是公司经营策略&#xff0c;更多是对市场需求的经营策略&#xff0c;体现在生产时机上的不同&#xff0c;一个是等客户需求&#xff0c;一个是填…

程序员健康指南:运动,让代码更流畅

程序员健康指南&#xff1a;运动&#xff0c;让代码更流畅 程序员&#xff0c;一个与电脑相伴的群体&#xff0c;长时间的久坐和高强度的脑力劳动是他们的日常。然而&#xff0c;久坐不仅影响体态&#xff0c;更对心脏健康构成威胁。根据《欧洲心脏杂志》的研究&#xff0c;中…

Caddy2使用阿里云DNS申请https证书,利用阿里云DNS境内外不同解析给Gone文档做一个同域名的国内镜像站点

我从头到尾实现了一个Golang的依赖注入框架&#xff0c;并且集成了gin、xorm、redis、cron、消息中间件等功能&#xff1b;自己觉得还挺好用的&#xff0c;并且打算长期维护&#xff01; github地址&#xff1a;https://github.com/gone-io/gone 文档原地址&#xff1a;https:/…

MTATLAB--一元线性回归分析

一文让你彻底搞懂最小二乘法&#xff08;超详细推导&#xff09; 在进行一元线性回归分析时&#xff0c;使用最小二乘法进行解题&#xff0c;关于最小二乘法具体看上述文章。 数据文件在文章顶部可见&#xff0c;将第一列数据作为自变量x&#xff0c;第二列数据作为应变量y。建…

使用java远程提交flink任务到yarn集群

使用java远程提交flink任务到yarn集群 背景 由于业务需要&#xff0c;使用命令行的方式提交flink任务比较麻烦&#xff0c;要么将后端任务部署到大数据集群&#xff0c;要么弄一个提交机&#xff0c;感觉都不是很离线。经过一些调研&#xff0c;发现可以实现远程的任务发布。…

【RabbitMQ】消息队列 - RabbitMQ的使用记录

目录 一、什么是消息队列 二、什么是RabbitMQ 三、安装RabbitMQ 3.1 安装Erlang环境 3.2 安装RabbitMQ 3.3 打开服务管理界面 3.4 常用命令 四、Python示例代码 4.1 发送数据 4.2 接收数据 一、什么是消息队列 消息队列(Message Queue)是一种用于在应用程序之间传递消…

vue:网页icon无法显示

logo文件放在public文件夹下&#xff0c;在html里设置icon。 本地源码运行后发现网页icon无法显示我们设置的logo&#xff0c;而是显示了浏览器默认icon。 这个问题不需要解决&#xff0c;部署后网页icon显示就正常了。

绝地求生PUBG新老艾伦格有什么差别 老艾伦格什么时候回归

复古风格的艾伦格原始地图携带着那些标志性的记忆符号华丽回归&#xff0c;邀请您沉浸于往昔的每一处细节探索中。我们不仅还原了游戏诞生的起点&#xff0c;还在其中巧妙融入现代游戏元素&#xff0c;构筑一座连接昔日与今朝的桥梁&#xff0c;完美融合了经典与创新的游戏体验…

【动态规划四】子序列问题

目录 leetcode题目 一、最长递增子序列 二、摆动序列 三、最长递增子序列的个数 四、最长数对链 五、最长定差子序列 六、最长的斐波那契子序列的长度 七、最长等差数列 八、等差数列划分 II leetcode题目 一、最长递增子序列 300. 最长递增子序列 - 力扣&#xff0…

关于SQL

数据库简介&#xff1a; 数据库分类 关系型数据库模型&#xff1a; 优点&#xff1a;易于维护&#xff0c;可以实现复杂的查询 缺点&#xff1a;海量数据 读取写入性能差&#xff0c;高并发下数据库的io是瓶颈 是把复杂的数据结构归结为简单的二元关系&#xff08;即二维表…

Linux字符设备驱动设计

Linux字符设备驱动设计 概述 驱动的定义与功能 计算机系统中存在着大量的设备&#xff0c; 操作系统要求能够控制和管理这些硬件&#xff0c; 而驱动就是帮助操作系统完成这个任务。 驱动相当于硬件的接口&#xff0c; 它直接操作、 控制着我们的硬件&#xff0c; 操作系统通…