DS-007 顺序表-寻找两个序列的中位数
题目:一个长度为L(L≥1)的升序序列S,处在第[L/2]个位置的数称为S的中位数。例如列S1=(11,13,15,17,19),则S1中的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若92=(2,4,6,8,20),则.S1和S2的中位数是11。现有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。
要求: (1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
答:
(1)算法思想:将A和B用二路归并合并排序成C,找C的中位数。
根据题目,序列S为奇数,5个元素,下标(0+4)/2=2,刚好第三个元素下标是2。,S的元素个数为偶数10,(0+9)/2 = 4 ,刚好取第5个元素。A、B等长,合并之后元素个数一定是偶数。
(2)C代码:
int Mid_Search(int A[], int B[], int n){int C[2n]; //要求分配最多存储2n个整数的存储空间,C指向这块空间int i, j, k;for(i=0, j=0, k=0; i<n && j<n; k++){if(A[i] <= B[j])C[k] = A[i++];elseC[k] = B[j++]; }while (i<n) C[k++] = A[i++];while (j<n) C[k++] = B[j++];return C[(2n-1)/2];
}
解析:
- n为数组长度,A、B长度相等,A、B最大下标n-1,合并后C的最大下标2n-1
- for循环初始化i,j为0。入口条件是i、j同时小于n,即遍历完一个数组就退出循环。另一个数组的剩余部分由下面的while循环执行。
- 将A、B的元素比较,将较小的那个写到数组C中。
- C[k] = A[i++];相当于执行C[k] = A[i]; i++;for循环会再将k自增1,表示下一次较小的元素存放在C的位置。
- 一个数组遍历完成后,退出for循环。另一个数组的所有元素都比当前C中的元素大,再依次存放数组C中。
- 最后返回C的中位数,即为所求的中位数。
(3)该算法时间复杂度为O(n),空间复杂度为O(n)。
以上不是最佳算法,下面最优算法太难想。
时间复杂度为O(log2n),空间复杂度为O(1)。
int M_Search(int A[],int B[],int n){int s1=0,d1=n-1,m1,s2=0,d2=n-1,m2;//分别表示序列A和B的首位数、末尾数和中位数while(s1!d1||s2!=d2){m1=(s1+d1)/2;m2=(s2+d2)/2;if(A[m1]==B[m2])return A[m1]; //满足条件1if(A[m1]<B[m2]){ //满足条件2if((s1+d1)%2==0){ //若元素个数为奇数s1=m1; //舍弃A中间点以前的部分且保留中间点d2=m2; //舍弃B中间点以后的部分且保留中间点}else{ //元素个数为偶数s1=m1+1; //舍弃A中间点及中间点以前部分d2=m2; //舍弃B中间点以后部分且保留中间点}}else { //满足条件3if((s2+d2)%2==0){ //若元素个数为奇数d1=m1; //舍弃A中间点以后的部分且保留中间点s2=m2; //舍弃B中间点以前的部分且保留中间点}else{ //元素个数为偶数d1=m1; //舍弃A中间点以后部分且保留中间点s2=m2+1; //舍弃B中间点及中间点以前部分}}}return A[s1]<B[s2]?A[s1]:B[s2];
}
DS-007 顺序表-寻找两个序列的中位数相关推荐
- 两个序列的中位数(超详细的讲解)
问题描述:在两个等长的升序序列中找到两个序列的中位数,设s序列的长度为n(n>=1),称n/2个位置的数为s的中位数 我在这里简单分享下自己对这道题的看法.暴力法这里不谈了,仅仅谈谈教材上的减治 ...
- 减治算法——两个序列的中位数
这种算法与分治算法类似,分治法是把一个大问题分成若干个子问题,分别求解各个子问题,然后再把子问题的解进行合并得到原问题的解.而剪枝法同样是把一个大问题划分成为若干个子问题,但是这些子问题不需要分别求解 ...
- c语言合并两个顺序表算法,顺序表的两种合并操作(C语言)
#include #include //基本操作函数用到的状态码 #define TRUE 1; #define FALSE 0; #define OK 1; #define ERROR 0; #de ...
- C语言利用顺序表求两个集合的差集
Description A和B分别表示两个集合,集合中的元素为整数,C=A和B的差集,计算并依次输出C中的元素. 要求:用顺序表存储,另辟空间保存C中元素 . Input 输入集合A的元素个数n(n& ...
- 顺序表之两个有序顺序表合并
(2.2.4-7)将两个有序顺序表合并为一个新的有序顺序表. 思路:两个有序表分别从头开始比较,将较小值放入新表:如果一个顺序表已经到底另外一个还有,直接将还有值的那个表所有尾插入新表. 代码如下: ...
- JAVA输出两个顺序链表的并集_(顺序表)两个集合求并集-洋葱先生-杨少通
注:本程序由Visual Studio 2015编写,与VC++6.0稍有区别,复制到VC++6.0下注释掉"#include "stdafx.h""即可运行, ...
- 两个序列的中位数c语言,小白在线求教 用归并排序实现查找两个有序序列的中位数...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 两个有序序列的中位数 (20分) 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A0,A1,⋯,AN−1的中位数指A ...
- DHU数据结构-顺序表- ADT应用-找出两个等长升序序列的中位数
目录 1.题目 2.题解 3.代码实现 1.题目 顺序表ADT模板简单应用算法设计:找出两个等长升序序列的中位数 作者: 教材 时间限制: 1S 章节: DS:线性表 问题描述 : 目的:使用自行设计 ...
- 3、顺序表、内存、类型、python中的list
1.内存.类型本质.连续存储 1.内存本质 2.C 语言实例-计算 int, float, double 和 char 字节大小 使用 sizeof 操作符计算int, float, double 和 ...
最新文章
- centos6.4安装java,CentOS6.4下YUM安装MySQL和JDK和Tomcat
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
- xp系统的计算机管理中用户在哪里,XP系统设备管理器中一片空白怎么修复?
- mysql 开启远程访问
- HtmlWebpackPlugin实现资源的自定义插入
- 调用 动态库 实现插件(windows linux)
- 电子科技大学 高级计算机结构,电子科技大学计算机系统结构作业答案
- 计算方法太牛了,留着以后教孩子!!!
- 智能会议系统(5)---SipDemo
- conky的自动启动
- java并发之如何解决线程安全问题
- Ros双线主辅同时映射一台服务器
- 201671030107词频统计软件项目报告
- 常吃西红柿治疗十种病以及食用的一些禁忌
- CAN波特率与负载率
- inurl+:php?id,实操:SQL注入国外xx网站
- CenterNet环境搭建记录
- 利用matplotlib画函数图像
- 2022-2028全球与中国角膜矫正术市场现状及未来发展趋势
- 计算机丢失quartz.dll什么意思,全民K歌运行时提示quartz.dll文件丢失,如何修复