代码改变世界

算法第二章上机实践报告

2019-09-23 21:29  秃头小张  阅读(150)  评论(0编辑  收藏  举报

一、实践题目

我主要讲一下第三道题目,因为第三道题目感觉在做的时候遇到了比较大的困难,而且最终做出来还是有一个错误 最大N是答案错误的没搞懂。也希望老师看了之后能够指正。

二、问题描述

 

 

这个问题主要是要处理两个已经排好序的数组 找出中位数。因为时间复杂度要求为O(logn),故选择用二分算法。

三、算法描述 

 

可能代码写得比较复杂。

大概的思路是先找出两个数组各自的中位数,取中位数小的数组的右边(包括中位数),取中位数大的数组的右边(包括中位数),直到两个数组各剩下两个数,然后比较两个数组的第一个元素,如果一个数组的第一个元素大于另一个数组的第一个元素且小于另一个数组的第二个元素,则该元素即为两个数组的并集的中位数;如果第一个元素大于另一个数组的两个元素,则另一个数组的第二个元素即为两个数组的中位数。

此时有两种另外的情况:

①若数组的长度为1时,那么直接输出两个数组中的最小数;

②当数组的长度为偶数时,在取中位数时如果按奇数数组那种取法取出来的数组是不等长的,最终可能导致中位数不在最后的数组里,所以采用一个数组的中位数加一,另一个不变,来使得取出来的数组等长。

四、算法时间复杂度及空间复杂度分析

时间复杂度:因为采用的是二分算法,故时间复杂的为O(logn);

空间复杂度:算法中辅助空间并不随着数组长度n而线性增大,所以空间复杂度为O(1)。

 五、心得体会

 

 

 

 

 最后这段代码改到最后还是有一个最大N的错误不知道如何再改正。不过这次题目让我更好地掌握了二分算法,也更好的理解了logn的时间复杂度。