数据结构:有序表的合并

前文介绍了《有序表的插入》,本文介绍有序表的合并。这两种对有序表的操作,是数据结构中常考的内容,特别是在 408 考卷中,在算法设计的题目中,有可能会考查对有序表的操作。那么,这两篇文章中的方法就是能够拿到基本分数的方法。

例题 3.10.3 假设有两个非递减有序表 LA 和 LB,设计一个算法,将它们合并成一个非递减有序表 LC(假设每个有序表中和两个有序表间均不存在重复元素)。

【解】

采用二路归并算法将两个有序表合并成一个有序表,其过程是:创建空表 LC,且长度是 LA 和 LB 长度之和。分别扫描 LA 和 LB 两个有序表:

  • 当两个有序表都没有扫描完成时,循环执行:比较 LA 和 LB 的当前元素,将其中较小的元素插入到 LC 中,再从较小元素所在的有序表中取下一个元素。
  • 重复此过程,直到 LA 或 LB 比较完毕,最后将未比较的有序表中余下的元素插入到 LC 中。

举例:LA = (1, 3, 5), LB = (2, 4, 8, 10) ,按照上述算法,过程如图 3.10.1 所示。

在这里插入图片描述

图 3.10.1 合并有序表

(1)采用顺序表存放有序表

【算法描述】

//顺序表存储结构
typedef struct{ElemType *elem;    //存储空间的基地址int length;        //当前长度
}SqList;               //顺序表的结构类型为 SqListvoid MergeList(SqList LA, SqList LB, SqList &LC){//i,j 是 LA,LB 的下标,k 是 LC 中的元素个数 int i = 0, j = 0, k = 0; LC = (SqList *)malloc(sizeof(SqList));//LA 和 LB 均未到达表尾while(i < LA.length && j < LB.length){if (LA.elem[i] < LB.elem[j]){LC.elem[k] = LA.elem[i];i++;k++;} else {LC.elem[k] = LB.elem[j];j++;k++;}}//LA尚未扫描完毕,将其余元素插入 LC 中while(i < LA.length){LC.elem[k] = LA.elem[i];i++;k++;}//LB尚未扫描完毕,将其余元素插入 LC 中while(j < LB.length){LC.elem[k] = LB.elem[j];j++;k++;}LC.length = k; 
}

上述写法比较容易理解,但写法不紧凑,可以对上述写法进行改进。

void MergeList(SqList LA, SqList LB, SqList &LC){LC.length = LA.length + LB.length; //新表的长度LC.elem = new ElemType[LC.length]; //为新表分配数组空间pc = LC.elem; //指针 pc 指向新表的第一个元素pa = LA.elem;pb = LB.elem;//指针 pa_last 指向 LA 的最后一个元素pa_last = LA.elem + LA.length - 1; pb_last = LB.elem + LB.length - 1;//LA, LB 均未达到表尾while((pa <= pa_last) && pb <= pb_last){if(*pa <= *pb)*pc++ = *pa++;else*pc++ = *pb++;}//LB已到表尾,依次将 LA 剩余元素插入 LC 的最后while(pa <= pa_last) *pc++ = *pa++;//LA已到表尾,依次将 LB 剩余元素插入 LC 的最后while(pb <= pb_last) *pc++ = *pb++;
}

【算法分析】

假设 LA 和 LB 的长度分别为 m m m n n n ,元素比较次数:

  • 最好情况下的比较次数是 min ⁡ ( m , n ) \min(m,n) min(m,n) 。时间复杂度是 O ( min ⁡ ( m , n ) ) O(\min(m,n)) O(min(m,n))
  • 最坏情况下的比较次数是 m + n − 1 m+n-1 m+n1 。时间复杂度是 O ( m + n ) O(m+n) O(m+n)

空间复杂度为 O ( m + n ) O(m+n) O(m+n)

(2)采用单链表存放有序表

假设头指针为 LALB 的单链表分别为线性表 LA 和 LB 的存储结构,现要归并 LA 和 LB 得到单链表 LC。因为链表结点之间的关系是通过指针指向建立起来的,所以用链表进行合并不需要另外开辟存储空间,可以直接利用原来两个表的存储空间,合并过程中只需把 LA 和 LB 两个表中的结点重新进行链接即可。

按照二路归并的思想,需设立 3 个指针 papbpc

  • papb 分别指向 LA 和LB 中当前待比较插入的结点, pc 指向 LC 中当前最后一个结点(LC 的表头结点设为 LA 的表头结点)。
  • 指针的初值:papb 分别指向 LA 和 LB 表中的第一个结点,pc 指向空表 LC 中的头结点。通过比较指针 papb 所指向的元素的值,依次从 LA 或 LB 中“摘取”元素值较小的结点插入到 LC 的最后,当其中一个表变空时,只要将另一个表的剩余段链接在 pc 所指结点之后即可。

【算法描述】

//单链表存储结构
typedef struct LNode{ElemType data;  //结点的数据域struct LNode * next; //结点的指针域
}LNode, *LinkList;  //LinkList 为指向结构体 LNode 的指针类型void MergeList(LinkList &LA, LinkList &LB, LinkList &LC){//LA, LB 是带头结点的单链表pa = LA->next;pb = LA->next;LC = LA; //用 LA 的头结点作为 LC 的头结点pc = LC; //pc 的初始值指向 LC 的头结点// LA, LB 均未到达表尾,依次“摘取”其中较小的结点插入到 LC 最后while(pa && pb){if(pa->data < pb->data){pc->next = pa; //将 pa 所指结点作为到 pc 所指结点的后继pc = pa; //pc 指向 pa,即为 LC 的尾结点指针pa = pa->next; //pa 指向下一个结点} else {pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa: pb; //将非空表的剩余段插入到 pc 所指结点之后delete LB;  //释放 LB 的头结点
}

【算法分析】

  • 时间复杂度 O ( m + n ) O(m+n) O(m+n)
  • 空间复杂度 O ( 1 ) O(1) O(1)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32Cubemx-H7-8-维特科技WT61C-TTL陀螺仪获取XYZ角度

前言 本人玩车的时候要用到陀螺仪 MPU6050容易卡死&#xff0c;然后还很漂&#xff0c;还是太难用了 68块钱的陀螺仪再上位机上的效果挺满意&#xff0c;于是打算用串口用到自己的模型上 本文教大家如何编写串口程序&#xff0c;通过串口获取角度 大家把本文的原理学会后&…

本地部署Navidrome个人云音乐平台随时随地畅听本地音乐文件

文章目录 前言1. 安装Docker2. 创建并启动Navidrome容器3. 公网远程访问本地Navidrome3.1 内网穿透工具安装3.2 创建远程连接公网地址3.3 使用固定公网地址远程访问 前言 今天我要给大家安利一个超酷的私有化音乐神器——Navidrome&#xff01;它不仅让你随时随地畅享本地音乐…

音视频入门基础:RTP专题(15)——FFmpeg源码中,获取RTP的视频信息的实现

一、引言 通过FFmpeg命令可以获取到SDP文件描述的RTP流的视频压缩编码格式、色彩格式&#xff08;像素格式&#xff09;、分辨率、帧率信息&#xff1a; ffmpeg -protocol_whitelist "file,rtp,udp" -i XXX.sdp 本文以H.264为例讲述FFmpeg到底是从哪个地方获取到这…

配置 Thunderbird 以使用 outlook 邮箱

配置 Thunderbird 以使用 outlook 邮箱 thunder bird 作为邮件客户端非常好用&#xff0c;不用每次登录邮箱网页端查看邮件&#xff0c;直接打开配置好的 thunder bird 即可免登录查看邮件。 0. 什么是 Thunder Bird ? https://www.thunderbird.net/zh-CN/ Thunderbird 创立…

关于ModbusTCP/RTU协议转Ethernet/IP(CIP)协议的方案

IGT-DSER智能网关模块支持西门子、倍福(BECKHOFF)、罗克韦尔AB&#xff0c;以及三菱、欧姆龙等各种品牌的PLC之间通讯&#xff0c;支持Ethernet/IP(CIP)、Profinet(S7)&#xff0c;以及FINS、MC等工业自动化常用协议&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪…

蓝桥杯省赛真题C++B组-裁纸刀2022

一、题目 问题描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 小蓝有一个裁纸刀&#xff0c;每次可以将一张纸沿一条直线裁成两半。 小蓝用一张纸打印出两行三列共 6 个二维码&#xff0c;至少使用九次裁出来&#x…

阿里云操作系统控制台实战评测:提升云资源管理与监控效率

文章目录 前言产品介绍操作系统控制台体验阿里云操作系统开通 帮助与总结建议 前言 随着云计算和虚拟化技术的发展&#xff0c;操作系统控制台作为运维管理的核心工具之一&#xff0c;在现代IT环境中发挥着越来越重要的作用。它提供了一种更加直观、高效的方式来管理操作系统&…

C++ 链表List使用与实现:拷贝交换与高效迭代器细致讲解

目录 list的使用&#xff1a; 构造与赋值 元素访问 修改操作 容量查询 链表特有操作 拼接&#xff08;Splice&#xff09; C11 新增方法 注意&#xff1a; stl_list的模拟实现&#xff1a; 一、链表节点设计的艺术 1.1 结构体 vs 类的选择 二、迭代器实现的精髓 2…

复试难度,西电卓越工程师学院(杭研院)考研录取情况

01、卓越工程师学院各个方向 02、24卓越工程师学院&#xff08;杭研院&#xff09;近三年复试分数线对比 PS&#xff1a;卓越工程师学院分为广研院、杭研院 分别有新一代电子信息技术、通信工程、集成电路工程、计算机技术、光学信息工程、网络信息安全、机械&#xff0c;这些…

【JavaEE】线程池

【JavaEE】线程池 一、引言1.1 什么是线程池1.2 为什么要使用线程池 二、ThreadPoolExecutor类2.1 构造方法2.1.1 corePoolSize和maximumPoolSize2.1.2 KeepAliveTime和unit2.1.3 BlockingQueue<Runnable> workQueue2.1.4 ThreadFactory threadFactory2.1.5 RejectedExec…

GaussDB安全配置指南:从认证到防御的全方面防护

一、引言 随着企业数据规模的扩大和云端化进程加速&#xff0c;数据库安全性成为运维的核心挑战之一。GaussDB作为一款高性能分布式数据库&#xff0c;提供了丰富的安全功能。本文将从 ​认证机制、权限控制、数据加密、审计日志​ 等维度&#xff0c;系统性地讲解如何加固 Ga…

Ubuntu 22.04 升级到 Ubuntu 24.04 全流程指南

&#x1f4cc; 1. 前言 Ubuntu 24.04 是最新的 LTS 版本&#xff0c;带来了内核更新、性能优化以及更强的安全性。本指南详细记录了从 Ubuntu 22.04 升级到 24.04 的完整过程&#xff0c;包括 升级前的准备、遇到的问题及如何选择最佳选项&#xff0c;避免升级失败或系统损坏。…

Git和GitHub基础教学

文章目录 1. 前言2. 历史3. 下载安装Git3.1 下载Git3.2 安装Git3.3 验证安装是否成功 4. 配置Git5. Git基础使用5.1 通过Git Bash使用5.1.1 创建一个新的仓库。5.1.1.1 克隆别人的仓库5.1.1.2 自己创建一个本地仓库 5.1.2 管理存档 5.2 通过Visual Studio Code使用 6. Git完成远…

【leetcode hot 100 234】回文链表

错误解法一&#xff1a;正序查找的过程中&#xff0c;将前面的元素倒叙插入inverse链中&#xff0c;找到偶数中点时&#xff0c;对称查找。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* Li…

Manus:成为AI Agent领域的标杆

一、引言 官网&#xff1a;Manus 随着人工智能技术的飞速发展&#xff0c;AI Agent&#xff08;智能体&#xff09;作为人工智能领域的重要分支&#xff0c;正逐渐从概念走向现实&#xff0c;并在各行各业展现出巨大的应用潜力。在众多AI Agent产品中&#xff0c;Manus以其独…

IDEA(十一)调整新版本的工具栏显示Git操作(pull、commit、push、revert等)

目录 一、背景二、操作步骤2.1 开启新 UI 样式2.2 设置 Tool Window 工具栏 一、背景 好久没有更新 IDEA 了&#xff0c;更新之后发现 IDEA 的工具栏消失了。一番操作之后&#xff0c;终于把 IDEA 的工具栏的设置调整好了&#xff0c;在此进行记录调整步骤&#xff0c;供大家学…

Mysql快速学习——《一》: Mysql的基础架构

了解mysql的基础架构, 理解大概的实现思想, 更有利与我们知之所以然, 是我们学习mysql起来思路更清晰, 效率更高. 思维导图: mysql 基础架构 mysql基础架构.png 1. 连接器 Mysql作为服务器&#xff0c;一个客户端的Sql连接过来就需要分配一个线程进行处理&#xff0c;这个线程…

[Pytorch报错问题解决]AttributeError: ‘nn.Sequential‘ object has no attribute ‘append‘

问题 运行深度学习代码的时候遇到了以下报错问题&#xff1a; Traceback (most recent call last):File "/home/anaconda3/envs/Text2HOI/lib/python3.9/site-packages/torch/autograd/grad_mode.py", line 28, in decorate_contextreturn func(*args, **kwargs)Fi…

小支从学习到认证:NebulaGraph 图数据库认证之旅

前言 在数据爆炸的当下&#xff0c;图数据库凭借其独特的优势&#xff0c;成为处理复杂数据关系的有力工具。NebulaGraph 作为图数据库领域的佼佼者&#xff0c;以高性能、可扩展性和易用性赢得了广泛认可。对于想要在这一领域深入发展的专业人士来说&#xff0c;从学习到获得 …

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目录 1. git update-git-for-windows 报错2. 解决方案2.1. 更新 CA 证书库2.2. 使用 SSH 连接&#xff08;推荐&#xff09;2.3 禁用 SSL 验证&#xff08;不推荐&#xff09;2.4 使用pull不使用update 1. git update-git-for-windows 报错 LenovoLAPTOP-EQKBL89E MINGW64 /d/…