| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 两个有序序列的中位数 -> 正文阅读 |
|
[数据结构与算法]两个有序序列的中位数 |
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0?,A1?,?,AN?1?的中位数指A(N?1)/2?的值,即第?(N+1)/2?个数(A0?为第1个数)。 输入格式:输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。 输出格式:在一行中输出两个输入序列的并集序列的中位数。 输入样例1:
输入样例2:
输出样例2:
? ?题目中中位数的概念:对于有序序列A0?,A1?,?,AN?1?,第一个数下标为0,最后一个数下标为N-1,故中位数的下标为(0+N-1)/2 =(N-1)/2,即A(N?1)/2?,是第?(N+1)/2?个数(A0?为第1个数)。([N-1]/2+1) 第一次通过的时候,用c语言,使用的数组。
输出中位数下标的确定:讲2N个元素存入数组h中后,元素按A0,A1....A(2N-1)存储,由上中位数的分析,要输出的中位数下标为(2N-1)/2即N-1,输出h(N-1)即可。 可采用二分查找的方法解答本题: 需要注意的为,舍弃某一数列的前半部分应与舍弃的另一数列前半部分个数相等。具体操作为:若要保留的是数组前半部分,则正常保留;若要保留的是数组的后半部分,则分两种情况(1)数组元素个数为奇数,则正常保留(2)数组元素个数为偶数,则需要少保留一位,即low?= mid+1。 判断数组个数奇偶的方法:(low+high)/2 == 0 为奇,结果为1则为偶。原因为:若数组个数为奇数,则数组两端的元素下标应为同奇偶(345? 3和5同为奇|234 2和4同为偶)同奇偶都两数相加均为偶数,故除以2没有余数;若数组个数为偶数,则数组两端下标一定奇偶性不相同,和必定为奇数,故除以2有余数。
时间复杂度缩小为logn,空间复杂度为1 代码及思路参考了 设计一个算法求给定的两个有序序列的中位数 (分治算法)_#两个西柚-CSDN博客_两个有序序列的中位数 PTA:两个有序序列的中位数(二分法)_马可仕马可仕的博客-CSDN博客 两篇博客,感谢。 C++提供了sort排序函数,在本题直接运用很方便。 关于sort函数: sort函数用于C++中,对给定区间所有元素进行排序,默认为升序,也可进行降序排序。sort函数进行排序的时间复杂度为n*log2n,比冒泡之类的排序算法效率要高,sort函数包含在头文件为#include的c++标准库中。 start表示要排序数组的起始地址; 注意C++中引用的用法,在堆区开辟内存,手动开辟,手动释放。 利用new创建的数据,会返回该数据对应的类型的指针 数组释放方式:delete[] 数组名
本段代码参考了 https://blog.csdn.net/qq_45745322/article/details/108940879?感谢 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 5:52:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |