算法第二章实验报告

一、实践题目名称

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;

const int MAXN = 10010;

int find(int* a, int l, int r) {
    
    if (l == r)
        return a[l];
        
    int mid = (l + r) / 2;
    
    if (a[mid] > a[mid + 1])
        return find(a, l, mid);
    else
        return find(a, mid + 1, r);
}

int main() {
    int n;
    cin>> n;
    int a[n];
    for (int i = 0; i< n; i++) {
        cin>> a[i];
    }
    cout<<find(a, 0, n - 1);
    return 0;
}

 

可以将数组分为单增和单减两部分,峰值为数组的最大值。使用二分搜索法进行查找。

若 a[mid] > a[mid + 1] ,说明最大值(峰值)在其左侧;

反之,说明最大值(峰值)在其右侧;

当a[mid] > a[mid - 1] &&a[mid] > a[mid + 1] 时,a[mid]即为数组的最大值,查找成功。

 

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

时间复杂度:因为使用二分搜索法,子问题规模为原问题规模的一半,取mid值的时间复杂度均为O(1),所以T(n) = T (n/2) + O(1) = O(log n)

空间复杂度:因为没有借助辅助数组,与问题规模n大小无关,所以空间复杂度为O(1)

 

五、心得体会

这次上机实验课,两两为一组。要让搭档了解自己的做题方法。这个上课的形式不仅让我们学多一种解题方法,还能在给搭档解释自己的方法的时候巩固关于分治法的知识点,因为当能给别人讲懂一道题时,说明自己已经真正懂了。希望接下去继续用这种方法和搭档共同进步。

 

六、分治法的个人体会和思考

分治法就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。使用过该方法有时有效能缩短算法的时间复杂度,提高效率。今后在编写代码的时候,可以考虑是否使用分治法来解题。

 

posted @ 2021-10-12 21:00  Dtsuki  阅读(27)  评论(0编辑  收藏  举报