两个有序序列的中位数(二分搜索)
来源:互联网 发布:杭州程序员招聘网站 编辑:程序博客网 时间:2024/06/05 02:55
问题:
已知有两个等长的非降序序列S1, S2,设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
算法描述:
① 输入两个长度自定且等长的数组,然后对他们进行赋值。算法的思路是分别取他们的中位数进行比较,假设两个数组如下:
1
3
5
7
9
2
3
4
5
6
上面数组的中位数是比下面数组的中位数大的,接下来的操作就是取大中位数的左边(包括中位数),取小中位数的右边(包括中位数)。
1
3
5
4
5
6
再次重复以上操作,最后有
3
5
4
5
接下来已经不能再分别取他们的中位数缩小范围了,所以对两个数组进行比较。取数组的首位进行比较,如上即是3和4进行比较,若是哪边比较小就取它的下一位进行比较。过程就是3和4比(3比4小,所以下标加1)→5和4比(4比5小,所以得到中位数为4)→中位数为4。
这是当数组为奇数长度的情况,若是数组长度为1,或者是数组长度为偶数,要再次进行讨论。
② 当数组长度为1时,比较两个数,谁比较小谁就是中位数。
③ 当数组长度为偶数时,
-100
-10
1
1
1
1
-50
0
2
3
4
5
在第一步,取数组的中位数时候,若是按照奇数的方法,我们会发现,最后取出来的两个数组不是等长的,这样的话就会对我们的实际结果造成影响。如上,我们可以一个数组取第三个数,一个数组取第四个数这样进行比较,这样接下来得到的数组都是等长的。接下来步骤和奇数数组一样。
④ 在这里,偶数数组这样的取法原因是,我们每次取新数组出来,只要两个数组的长度和加起来是原来数组的一半或者大于一半,我们就可以保证中位数一直在我们取出来的新数组里面,不会出现中位数丢失的情况。
算法时间及空间复杂度分析:
时间复杂度:每一次调用的过程为判断余下数组长度是否大于2,接下来判断数组个数是奇数个还是偶数个,最后判断两个数组的中位数谁大谁小。所以t(n) = O(1)+O(1)+O(1)。总共执行次数为logn次。在主函数中,执行的语句为创建两个数组还有数组左右下标等变量,和为数组赋值。所以总的时间复杂度为T(n) = logn*t(n)+O(n)+O(1) = O(logn)。
空间复杂度:算法中辅助空间并不随着数组长度n而线性增大,所以空间复杂度为O(1)。
- 两个有序序列的中位数(二分搜索)
- 两个有序序列的中位数(详解)
- 两个有序序列的中位数
- 两个有序序列的中位数
- 2-13. 两个有序序列的中位数(25)
- PAT1019. 两个有序序列的中位数(25)
- 2-13. 两个有序序列的中位数(25)
- 两个有序序列的中位数(25 分)
- 两个有序序列的中位数(25 分)
- 7-1 两个有序序列的中位数(25 分)
- 7-19 两个有序序列的中位数(25 分)
- pat 两个有序序列的中位数
- PAT 两个有序序列的中位数
- 【C】两个有序序列的中位数
- PTA5-53 两个有序序列的中位数
- 求两个等长有序序列的中位数
- PAT DS 2-13两个有序序列的中位数
- 实验项目2-13:两个有序序列的中位数
- 问题 B: 最小公倍数和最大公约数
- 连接别人电脑的oracle数据库,配置TNS
- 设计模式C++实现(8)——代理模式
- 升级10.12后使用CocoaPod出现-bash: pod: command not found 解决办法
- 【LeetCode】167. Two Sum II
- 两个有序序列的中位数(二分搜索)
- [leetcode] 35. Search Insert Position
- Maximum Subarray-LeetCode JavaScript
- 选择结构
- 1191: 【蟠桃记】
- 独木舟上的旅行
- Max Consecutive Ones
- 在Win7下如何自动加载虚拟磁盘VHD文件
- linux 免登录以及配置别名登录