1.实践题目
maximum number in a unimodal array(单峰数组中的最大数目)
2.问题描述
求解单峰数组中的最大数目
给定的 n 个不同元素的单峰数组,在由n个(1<= n <= 10000)不同元素组成的数组中找到最大数,该数组特点为从小单调递增直到出现最大值,然后再逐渐递减,在时间复杂度为O(n)的情况下求出最大值。
3.算法描述
int biosearch( int a[],int left,int right) { while(left<=right)//满足二分法的条件,同时可以用于判断二分法何时停止 { int max=(left+right)/2; //二分法循环后缩小范围 if(a[max]>a[max-1]&&a[max]>a[max+1])//max大于左右,即为峰值,符合目的 { return max; } if(a[max]>a[max+1]&&a[max]<a[max-1])//max大于右边小于左边 最大值在right左边 从右往左缩小范围 更新右指针 { right=max-1; } else{ left = max+1;//同上理 最大值在left右边 从左往右缩小范围 更新左指针 } } }
4.算法时间及空间复杂度分析
时间复杂度分析:最坏情况的时候,不停进行二分对元素进行折半,while循环被执行了O(logn),一次循环体内部所需运算时间为O(1),整个算法在最坏情况下的计算时间复杂度为O(logn)。
空间复杂度分析:创造一个数组,并没借助辅助空间,只是对大小为n的数组进行操作,所以为O(1)。
5.心得体会
此次实践课利用曾经学习过的二分法直观易懂地让我们从时间复杂度和空间复杂度两个方面来感受算法设计的魅力和重要性,在学习过程中在和搭档讨论分享时也在不断完善自己的思维漏洞,借鉴他人的代码思维,同时对分治法的优点有了最直观的感受,让我受益匪浅,也正式明白了算法课和程序设计基础课的本质区别,启示我们算法的解决思路在于求解最优解。
6.分治法的个人体会和思考
分治法解释:面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
基本步骤:分解、求解子问题、合并。
思考:分治法很直观明了的让我们作为计算机系的学生去体会到了算法的意义和目的,联想到数据结构课上学的快排,二分法,堆排等算法,不难理解分治法其实早已穿插在以前的学习中。但是总的目的都是要对算法进行优化,寻找最优解,过程中要进行复杂度分析,不一定所有情况都必须用分治法或者分治法里是否还需要考虑最优解。
个人博客同步更新 Hi AM1ng! (am1ngkk.github.io)