上机实践报告
Posted lfh123123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了上机实践报告相关的知识,希望对你有一定的参考价值。
# 算法第二章上机实践报告
组员:梁锋华、叶星彤
## 实践题目
**7-3 两个有序序列的中位数**
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A?0??,A?1??,?,A?N−1??的中位数指A?(N−1)/2??的值,即第⌊(N+1)/2⌋个数(A?0??为第1个数)。
输入格式:
输入分三行。第一行给出序列的公共长度N(0<N≤100000),随后每行输入一个序列的信息,即N个非降序排列的整数。数字用空格间隔。
输出格式:
在一行中输出两个输入序列的并集序列的中位数。
## 问题描述
找出两个有序数组合并后的中位数,要求算法时间复杂度为lgn(输入时间不计算)。
## 算法描述
二分查找两个有序数组的中位数,比较两个数组中位数的大小,大的往前找,小的往后找,一直重复上述步骤——直到最后范围缩小到四个数,对其进行排序,输出第二大的数字。
时间复杂度:
O(lgn)
要注意的一点是,为了保证两个数组的查找范围一致,要进行分类讨论(分为奇数和偶数)。
若是奇数,不断缩小查找范围的过程中产生的区间段也必定为奇数。
若是偶数,则可能产生奇数区间段和偶数区间段。
### 空间复杂度
O(1)
## 心得体会
一开始边界条件弄错了(不关我事?(¯?¯?))以及一开始没注意到偶数也会产生偶数区间,所以wa了好几发,最后终于改对了。
## 算法实现描述
用函数进行递归实现:
递归传参:
四个整型数字,al,ar,bl,br分别是两个数组a和b的左边界和右边界。
递归的跳出条件:
如果(if)当最后范围缩小到只剩下四个数的时候(al-ar等于1时),return 第二大的数字。
由于保证了a和b范围一样,所以只需要选其中一个边界进行判断即可。
要注意也会有n=1,也就是只有两个数的情况。
否则(else):
判断区间是奇数还是偶数。
然后,按照算法描述一样,比较a[(al-ar)/2]和b[(bl-br)/2]的大小,根据两者的大小情况缩小区间(慢慢缩小al和ar以及bl和br),传入递归。
以上是关于上机实践报告的主要内容,如果未能解决你的问题,请参考以下文章