算法第2章实践报告

7-1 maximum number in a unimodal array (40 分)
 

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

 

问题描述:

您是一个给定的由n个不同元素组成的单峰数组,这意味着它的条目是按升序排列的,直到它的最大元素为止,之后它的元素按降序排列。给出一个算法 时间复杂度为O(logn)的算法

一个由n个不同元素组成的一维数组,元素从小递增至最大数,然后依次递减,要求求出峰值且要求时间复杂度为O(logn),使用二分搜索法。当mid指针所指元素即大于其左边的元素又大于其右边的元素则为最大元素;若大于左边元素/小于右边元素则表明最大元素位于其右方,将左指针右移;若小于左边元素/大于右边元素则表明最大元素位于其左方,将右指针左移。

算法描述:

 

 

注意点:算法1中 mid=(l+r+1)/2, 因该计算方法向左取整的特性使得中间值会取小的那个数,如果数组只有两个两个元素,l和mid指针将永远指向较小数,陷入死循环,所以要+1

 

算法时间及空间复杂度分析:

子问题的规模为n/2,分解合并问题的时间为O(1)

T(n)=T(n/2)+O(1)=O(logn)

用主定理求解:

a=1,b=2,d=0

d=logb a=0,所以时间复杂度T(n)=O(n^d*logn)=logn

 

心得体会:

在解决该类问题:给定已按升序或者降序的n个元素a[0,n-1],要求在n个元素中找到特定元素x是可用二分搜索的方法,把问题分解为若干个规模相同的小问题更易求解。

 

分治法个人体会和思考:

分治,即分而治之,是将一个规模为n的问题分解为若干个规模相同的子问题。分治法的运用十分巧妙,一个问题,直接在main函数中使用多条if判断语句,其时间复杂度也许会比较大,但是使用分治法再递归调用问题的时间复杂度会大大减少,且代码的行数也会减少,变得更加易读。在运用分治法前,一定要分析清楚问题的边界条件;在使用递归算法时要注意返回的下标及终止条件。

 
posted @ 2021-10-07 15:45  欧丹萍  阅读(18)  评论(0编辑  收藏  举报