算法设计与分析——2

第二章实验报告

7-1 maximum number in a unimodal array 

1. 问题描述

   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

2. 算法描述

   主要思路:数组部分有序,单峰特点通过前后比较确定峰值;二分查找,减少比较次数。

   int bisearch(int n, int a[ ], int start, int end) {

     int mid;

     while (start <= end) {  // 满足循环条件:数组内有数据
       mid = (start + end) / 2;
       if (a[mid] >= a[mid - 1] && a[mid] >= a[mid + 1]) {  // 找到峰值:mid值比前后数值都大
         return a[mid];
       }
       else if (a[mid] >= a[mid -1] && a[mid] < a[mid + 1]) {  // 峰值在中间值右侧:mid值与前后呈递增
         start = mid + 1;  //在右侧继续查找:修改start值
       }
       else if (a[mid] < a[mid - 1] && a[mid] >= a[mid + 1]) {  // 峰值在中间值左侧:mid值与前后呈递减
         end = mid - 1;  // 在左侧继续查找:修改end值
       }
     }
     return -1;  //不满足循环条件,退出
   }

 

3. 时间复杂度分析

   二分查找,取中值:O(1);每次查找规模是原来的一半:T(n/2)。通过主定理求解,整个问题的时间复杂度为O(logn)。

4. 空间复杂度分析

   仅引入mid,空间复杂度为O(1)。

5. 心得体会

   此次实验课,通过小组形式写代码,我发现了许多自己平时写代码时没有注意到的小问题,也通过小组积极的讨论,在写代码过程中,思路更清晰流畅,遇到问题也能更快地讨论解决,而不是卡在原地然后放弃。

   这道题采用了分治法中的二分查找的典型例子:

   分治法的基本思想是将一个规模较大的问题,分解为k个规模较小相互独立与原问题相同的子问题,递归求解子问题,再合并子问题得到原问题的解,降低复杂性,而二分查找通过二分来分解子问题,通过前后比较来求解子问题,又巧妙利用了输入数据的特性,提高了效率。

posted @ 2021-10-08 21:35  alleyn  阅读(34)  评论(0编辑  收藏  举报