算法第二章实验报告

一、实践题目

 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类型的binarysearch(int a[], int l, int r)函数,该函数用于进行二分查找,数组a[ ]存放输入数组 ,l和r分别为数组存放的最左边界下标和最右边界下标。

2、在binarysearch(int a[], int l, int r)函数中,定义了一个变量m,m表示(l+r)/2的中间数值的下标,这时我们可以判断,当(a[m]>a[m+1]&&a[m]>a[m-1]),m就是峰值,返回输出m。当(a[m]>a[m+1]&&a[m]<a[m-1]),m比后一个大,比前一个小,说明峰值在m前半段,令r=m-1。若不是前两种情况,则是峰值在m后半段,令l=m+1。(同时要注意单峰数组可能有出界的情况)

3、最后在main()函数,利用for循环输入数组,输出binarysearch(a, 0, n-1)。

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

时间复杂度:本题binarysearch函数用来二分查找,时间复杂度要求O(log n)。

空间复杂度:在binarysearch函数中,递归调用m会随着次数产生不同的值,空间复杂度也为O(log n)。

五、心得体会

二分查找上学期的数据结构就学过了,算法课上感觉更注重细节和实操。我和搭档在做题过程中,也有讨论算法的规范和书写的逻辑,在讨论和实操过程感觉也能理解得好一点。在做题过程当中,也遇到了一些问题,比如最后一道题,采用其他的方式可以做出,但是不用二分查找的方法时间复杂度比较高,还是需要多加理解和练习。

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

1、分治法的基本步骤:

分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
治理:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题;
合并:将各个子问题的解合并为原问题的解。

2、分治法运用的过程当中,我们要注意边界等问题。

3、利用分治法可以大大提高程序运行的效率。

posted @ 2021-10-02 13:32  张月琼  阅读(57)  评论(0编辑  收藏  举报