码迷,mamicode.com
首页 > 编程语言 > 详细

算法第二章上机实践报告

时间:2019-09-26 00:18:38      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:根据   若是   比较   缩小   有序   也会   minus   复杂   时间复杂度   

# 算法第二章上机实践报告

组员:梁锋华、叶星彤

## 实践题目

**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),传入递归。

算法第二章上机实践报告

标签:根据   若是   比较   缩小   有序   也会   minus   复杂   时间复杂度   

原文地址:https://www.cnblogs.com/lfh123123/p/11588394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!