第二章实验报告
一.实验题目
maximum number in a unimodal array
You are a given a unimodal array of n distinct elements, meaning that its entries are in increasing order up until its maximum element, after which its elements are in decreasing order. Give an algorithm to compute the maximum element that runs in O(log n) time.
二. 问题描述:一个由n个元素组成的数组,数组中的元素排列方式是先递增再递减,然后需要通过程序找出数组中的最大数,并且要求算法时间复杂度为O(log n)。
三. 算法描述
(1)先定义一个int类型的Bisearch(int a[ ],int left,int right)函数,该函数用于进行二分查找。(2)在Bisearch函数中定义一个mid,mid表示(left+right)/2的中间数值下标,这时只要得到a[m]>a[m+1]&&a[m]>a[m-1],那么m这个位置储存的数就是最大的数,即我们要求的峰值;如果是a[m]>a[m+1]&&a[m]<a[m-1],那么峰值就在m这个位置前面的数,根据二分法对前面的数再进行搜索,直到找到最大值。如果是a[m]<a[m+1]&&a[m]>a[m-1],那么峰值就在m这个位置后面的数,再根据二分法搜索。
四. 算法时间复杂度以及空间复杂度的分析
时间复杂度:本题Bisearch函数用来二分查找,时间复杂度要求O(log n),利用if几个判断条件,每次判断的数都是原先的一半,进而可得出时间复杂度。
空间复杂度:在Bisearch函数中,递归调用m会随着次数产生不同的值,空间复杂度也为O(log n)。
五. 心得体会
刚开始不太懂二分法,后来在实践以及听了北航老师的课程,慢慢看懂了,然后自己敲代码,上课跟着老师的思路,慢慢有了更深刻的理解。
六. 分治法的个人体会与思考
(1)分治法运用的过程当中,我们要注意边界等问题。
(2)利用分治法可以大大提高程序运行的效率。