算法第二章实践报告

算法第二章实践报告

  • 实践题目名称:

单峰数组中的最大数

  • 问题描述:

给定的由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降序排列的,要求升序排列,此时使用二分法效率反而更低了。一般来说,规模较大的问题使用二分法来解决问题,效率可能会更高一点。所以,我们不能盲目追求“厉害的”方法,应该“因地制宜”地解决不同的问题,这也是我们程序员所需要注意的地方吧!

 

posted @ 2021-10-03 23:23  Fan文韬武略~  阅读(27)  评论(0)    收藏  举报