查找两个等长升序线性表的中位数
2016-07-26 17:39
183 查看
一个长度为L(L≥1)的升序序列S,处在第éL/2ù个位置的数称为S的中位数。例如,若序列S1=(11, 13, 15, 17, 19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2, 4, 6, 8, 20),则S1和S2的中位数是11。现有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法。
思考:如果这些数据已有序排列在一个序列中,则只通过一次下标计算,即可求得中位数。题目中所给的数据分属于两个有序序列,其中位数的位置不能再通过简单计算确定。该题可以有多种思路,例如,将两个有序序列归并为一个有序序列后再求其中位数,即可求解。但题目中要求“设计一个在时间和空间两方面都尽可能高效的算法”,这是解题的关键。显然,仅用归并过程求解不能满足要求。由于要处理的序列是升序序列,所以该题的处理过程也可借鉴对有序表进行2路归并的思想,代码如下:
思考:如果这些数据已有序排列在一个序列中,则只通过一次下标计算,即可求得中位数。题目中所给的数据分属于两个有序序列,其中位数的位置不能再通过简单计算确定。该题可以有多种思路,例如,将两个有序序列归并为一个有序序列后再求其中位数,即可求解。但题目中要求“设计一个在时间和空间两方面都尽可能高效的算法”,这是解题的关键。显然,仅用归并过程求解不能满足要求。由于要处理的序列是升序序列,所以该题的处理过程也可借鉴对有序表进行2路归并的思想,代码如下:
int M_Search( int A[ ], int B[ ],int n ) i = j = k = 0; while ( i<n && j<n ) { k++; if( A[i] < B[j] ) { i++; if( k==n ) returnA[i-1]; } else { j++; if( k==n ) returnB[j-1]; } } }
相关文章推荐
- [转载] ffmpeg摄像头视频采集-采集步骤概述并采集一帧视频
- Xcode 编辑窗口左边的小圆圈不能点击问题 显示关联控件
- 安卓学习笔记---Intent的使用,如何改变Activity在当前任务堆栈中的顺序
- 获取webservice 返回的 dataset 数据集 并转换成 datatable
- Nexus6P使用小技巧
- elk 搭建
- 如何判断jquery选择器选择结果为空
- smali语法
- Oracle中 instr 函数
- spring-jedis哨兵模式,不能远程连接
- 创建RichFaces工程(idea、maven、JSF2、RichFaces4)
- 文件与目录的默认权限与隐藏权限
- log4j.xml 详解
- chrome新标签页插件
- C#的枚举转换、应用例子
- elk 搭建
- android studio tabhost基础 多功能时钟app 闹钟铃声(七)
- backup incremental level 1 database
- c# List<T>与ObservableCollection<T>
- 编译安装nginx1.9.7+php7.0.0服务器环境