算法第二章实践报告
算法第二章实践报告
- 实践题目名称:
单峰数组中的最大数
- 问题描述:
给定的由n个不同元素组成的单峰数组,它的元素是递增的直到最大的元素,之后的元素是递减的。
给出计算运行时间为O(logn)的最大元素的算法。
- 算法描述:
由于是给出时间复杂度为O(logn)的最大元素的算法,可以想到经典的“二分查找法”。
先是取定“标兵” =a[mid],然后进行比较前后的大小。
cause1:当a[mid] > a[mid-1] && a[mid] > a[mid+1],则a[mid]就是所寻找的峰值。
cause2:当a[mid-1] > a[mid] && a[mid] > a[mid+1],则此时a[mid]处于单调递减,则峰值在a[mid]的左方。
cause3:当a[mid+1] > a[mid] && a[mid] > a[mid-1],则此时a[mid]处于单调递增,则峰值在a[mid]的右方。
- 代码
#include<iostream> using namespace std; int BS(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]){ return max; } if(a[max]>a[max+1] && a[max] < a[max-1]){ right=max-1; }else{ left = max+1; } } } int main(){ int n; cin >> n; int a[n]; for(int i=0;i<n;i++){ cin >> a[i]; } int k = BS(a,0,n-1); cout << a[k]; }
- 算法时间及空间复杂度分析
时间复杂度:由于max = (left+right)/2,每次while循环,数组大小就减少了一半。然后进行运算的时候,最差情况下的时间复杂度O(logn),且内部是if判断,无循环,因此算法的时间复杂度为O(logn)。
空间复杂度:该算法没有借助额外的辅助空间,只是用了个a[n]存储数据,所以空间复杂度为O(1)。
- 心得体会
本次的上机实验是由两人一起,一人实操,一人指导,两人互帮互助共同完成。在这过程当中,体会到每个人的思维方式都是不一样的,当我思路堵塞的时候,旁边的伙伴会提供别的方法思路;别操作的时候,我也能观测到别人的想法,也能从中学习到新的东西。
- 分治法的个人体会和思考
分治法——分而治之,把一个大规模的问题分成小规模问题,再从小问题切入,更快捷、容易解决整个问题。但是并不是什么都可以用二分法来解决的,具体问题需要具体分析,例如:987654321降序排列的,要求升序排列,此时使用二分法效率反而更低了。一般来说,规模较大的问题使用二分法来解决问题,效率可能会更高一点。所以,我们不能盲目追求“厉害的”方法,应该“因地制宜”地解决不同的问题,这也是我们程序员所需要注意的地方吧!

浙公网安备 33010602011771号