一、实践题目名称
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.
An integer n in the first line, 1<= n <= 10000. N integers in the seconde line seperated by a space, which is a unimodal array.
A integer which is the maximum integer in the array
7 1 2 3 9 8 6 5结尾无空行
9结尾无空行 三、算法描述
#include<iostream>
using namespace std;
int binarysearch(int a[], int l, int r){
while(l<=r){
int m=(r+l)/2;
if(a[m] > a[m+1] && a[m]>a[m-1]){
return m;
}
if(a[m]>a[m+1] && a[m]< a[m-1]){
r=m-1;
}
else{
l=m+1;
}
}
}
int main()
{
int n;
cin >> n;
int a[n];
for(int i=0; i<n; i++){
cin >> a[i];
}
int k = binarysearch(a, 0, n-1);
cout << a[k];
}
**采用二分搜索算法和递归算法,利用数组,若a[m] > a[m+1] && a[m]>a[m-1],则说明a[m]即为峰值,返回m即可,若a[m]>a[m+1] && a[m]< a[m-1],说明峰值在a[m]左侧,则令r=m-1,相反则为峰值在a[m]右侧,则需令l=m+1
四、算法时间及空间复杂度分析
时间复杂度分析:采用二分搜索算法,子问题规模为原问题规模的一半,每次取中间值的时间复杂度为O(1)
,T(n) = T (n/2) + O(1) = O(log n)
空间复杂度:创建了一个大小为n的数组,对此数组进行各项操作,空间复杂度为O(1)
五、心得体会
本次上机实验课我们小组课堂上一共完成了两道题目,主要是我的同伴打题,我来阐述分析代码,答题过程中没有遇到太大问题,在和同伴的交流过程中,我们熟悉并掌握了基础的二分搜索算法,理解了分治法的作用和好处,对于规定了算法时间复杂度,再来编写代码的问题,对我们理解和使用分治法有很大的帮助和锻炼。同时,这种两人小组合作分析题目的方式也是我第一次体验,我认为这种方式可以十分有效的帮助大家互相快速理解知识点,在实践课堂的交流过程中我也收获了很多。
六、分治法的个人体会和思考
分治,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治法分为三步:分解原问题、解决子问题、合并子问题。使用分治法的时候,一定要注意分解的子问题是否容易求解,规模是否较小,子问题之间是否独立,以及子问题的解是否能合并为原问题的解。对于求解规模较大的问题时,我们要先思考是否可以使用分治法求解,这样可以减少很多不必要的求解过程,分治法为我们带来了很多方便,帮助我们在很多问题上能找到更好的算法求解思路。