题目:一个长度为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];
}

解析:

  1. n为数组长度,A、B长度相等,A、B最大下标n-1,合并后C的最大下标2n-1
  2. for循环初始化i,j为0。入口条件是i、j同时小于n,即遍历完一个数组就退出循环。另一个数组的剩余部分由下面的while循环执行。
  3. 将A、B的元素比较,将较小的那个写到数组C中。
  4. C[k] = A[i++];相当于执行C[k] = A[i]; i++;for循环会再将k自增1,表示下一次较小的元素存放在C的位置。
  5. 一个数组遍历完成后,退出for循环。另一个数组的所有元素都比当前C中的元素大,再依次存放数组C中。
  6. 最后返回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 顺序表-寻找两个序列的中位数相关推荐

  1. 两个序列的中位数(超详细的讲解)

    问题描述:在两个等长的升序序列中找到两个序列的中位数,设s序列的长度为n(n>=1),称n/2个位置的数为s的中位数 我在这里简单分享下自己对这道题的看法.暴力法这里不谈了,仅仅谈谈教材上的减治 ...

  2. 减治算法——两个序列的中位数

    这种算法与分治算法类似,分治法是把一个大问题分成若干个子问题,分别求解各个子问题,然后再把子问题的解进行合并得到原问题的解.而剪枝法同样是把一个大问题划分成为若干个子问题,但是这些子问题不需要分别求解 ...

  3. c语言合并两个顺序表算法,顺序表的两种合并操作(C语言)

    #include #include //基本操作函数用到的状态码 #define TRUE 1; #define FALSE 0; #define OK 1; #define ERROR 0; #de ...

  4. C语言利用顺序表求两个集合的差集

    Description A和B分别表示两个集合,集合中的元素为整数,C=A和B的差集,计算并依次输出C中的元素. 要求:用顺序表存储,另辟空间保存C中元素 . Input 输入集合A的元素个数n(n& ...

  5. 顺序表之两个有序顺序表合并

    (2.2.4-7)将两个有序顺序表合并为一个新的有序顺序表. 思路:两个有序表分别从头开始比较,将较小值放入新表:如果一个顺序表已经到底另外一个还有,直接将还有值的那个表所有尾插入新表. 代码如下: ...

  6. JAVA输出两个顺序链表的并集_(顺序表)两个集合求并集-洋葱先生-杨少通

    注:本程序由Visual Studio 2015编写,与VC++6.0稍有区别,复制到VC++6.0下注释掉"#include "stdafx.h""即可运行, ...

  7. 两个序列的中位数c语言,小白在线求教 用归并排序实现查找两个有序序列的中位数...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 两个有序序列的中位数 (20分) 已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A0,A1,⋯,AN−1的中位数指A ...

  8. DHU数据结构-顺序表- ADT应用-找出两个等长升序序列的中位数

    目录 1.题目 2.题解 3.代码实现 1.题目 顺序表ADT模板简单应用算法设计:找出两个等长升序序列的中位数 作者: 教材 时间限制: 1S 章节: DS:线性表 问题描述 : 目的:使用自行设计 ...

  9. 3、顺序表、内存、类型、python中的list

    1.内存.类型本质.连续存储 1.内存本质 2.C 语言实例-计算 int, float, double 和 char 字节大小 使用 sizeof 操作符计算int, float, double 和 ...

最新文章

  1. centos6.4安装java,CentOS6.4下YUM安装MySQL和JDK和Tomcat
  2. java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
  3. xp系统的计算机管理中用户在哪里,XP系统设备管理器中一片空白怎么修复?
  4. mysql 开启远程访问
  5. HtmlWebpackPlugin实现资源的自定义插入
  6. 调用 动态库 实现插件(windows linux)
  7. 电子科技大学 高级计算机结构,电子科技大学计算机系统结构作业答案
  8. 计算方法太牛了,留着以后教孩子!!!
  9. 智能会议系统(5)---SipDemo
  10. conky的自动启动
  11. java并发之如何解决线程安全问题
  12. Ros双线主辅同时映射一台服务器
  13. 201671030107词频统计软件项目报告
  14. 常吃西红柿治疗十种病以及食用的一些禁忌
  15. CAN波特率与负载率
  16. inurl+:php?id,实操:SQL注入国外xx网站
  17. CenterNet环境搭建记录
  18. 利用matplotlib画函数图像
  19. 2022-2028全球与中国角膜矫正术市场现状及未来发展趋势
  20. 计算机丢失quartz.dll什么意思,全民K歌运行时提示quartz.dll文件丢失,如何修复

热门文章

  1. 每天起床第一句,先给自己打个气
  2. 数字货币这个软件在模拟器上打开崩溃
  3. CometOJ欢乐赛总结
  4. 书论75 钱泳《书学》
  5. ChatGPT分销版多开4.4.2版本源码
  6. 计算机毕业设计springboot网上体育用品商城系统
  7. TSR Watermark Image Pro(图水印制作软件)官方中文版V3.7.1.3 | 优秀的图片加水印的软件
  8. PS理论:高斯模糊与高反差保留
  9. java springboot景区购票微信小程序源码
  10. 立等可取:工具定制让Oracle优化变得更简单快捷