算法第2章上机实践报告
算法第2章上机实践报告
一、实践题目名称
两个有序序列的中位数(时间复杂度为logN)
二、问题描述
已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数。有序序列A0,A1,⋯,AN−1的中位数指A(N−1)/2的值,即第⌊(N+1)/2⌋个数(A0为第1个数)。
三、算法描述
采用二分法将问题规模减半,并对问题进行递归处理,考虑一下特殊情况。
关键算法:
①序列元素个数奇偶的处理:
此算法可保证偶数序列分割后保持对称性,而对奇数序列不产生影响,保证递归时子问题也是两个等长的序列。

②递归过程:
分别求得两个序列的中位数,比较两个序列的中位数。如果两个数相等,即为所求中位数;如果不相等,则对两个数中较大的数所在的序列进行剪掉比这个数大的部分的处理,其它数保留,较小的数所在的序列进行剪掉比这个数小的部分的处理,其它数保留。接下来,进行递归调用。

③当两个序列都只剩下一个元素时的处理:
比较剩下的两个数,较小的数即为所求中位数。

④当两个序列均剩下两个数而无法再递归下去时的处理:
第一个序列求中位数方法不变,第二个序列变为与第一个序列相同的方法求得中位数。

求得中位数后,再进行一次递归,剩下的三个数中,把剩一个数的那个数和剩两个数中的较小的那个数进行比较,比较的两个数中较小的那个数即为所求中位数。

四、算法时间及空间复杂度分析
采用二分法,每次都将问题规模减半和特殊情况的比较以及比较所用的时间,所以时间复杂度为O(logN)。因为只开辟了几个变量的地址和数据,所以空间复杂度为O(1)。
五、心得体会
二分法虽然在时间复杂度上有着明显的提升,但是需要考虑到所有的特殊情况,边界条件也是一大难点,一不小心就会造成死循环。即使自己打不出这样的代码,不过看懂别人的代码也是一种进步!原来不只是完成题目就可以,还可以思考如何找到最优的算法,降低时间复杂度。
六、分治法的个人体会和思考
分治法的关键在于如何分,如何合并子问题,找到递归算法。每一步都是值得思考的。在探索的过程中,可以通过举一些例子研究出通法和解决一些特殊情况,以达到全面思考问题的目的。
浙公网安备 33010602011771号