算法第2章实践报告

一、实践题目名称

  7-1 maximum number in a unimodal array

二、问题描述:

  从一个由n个(1<= n <= 10000)不同元素组成的数组中找到最大数(该数组元素特点是:从小单调递增直到出现最大值,然后再逐渐递减),同时要保证算法的时间复杂度是O(log n)

三、算法描述

先用一个数组array[n]来存储n个数据,然后根据二分法求解出最大元素值。

  设数组中第一个元素为left,最后一个元素为right,则middle=(left+right)/2

  利用array[middle]与它旁边元素进行比较(在这里选定和array[middle+1]进行比较),从而逐步缩小范围:

  ①当left=right时,直接返回结果array[left],即:

       if(left==right)

         return array[left];

  ② 当array[middle]>array[middle+1]时,说明最大值在(left,middle)区间内,所以我们令right=middle,将区间向左缩小,即:

     if(array[middle]>array[middle+1])

       return BinSearch(array,left,middle);

  ③当array[middle]<array[middle+1]时,说明最大值在(middle+1,right)区间内,所以我们令left=middle+1,将区间向右缩小,即:

        if(array[middle]<array[middle+1])

       return BinSearch(array,middle+1,right);

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

        时间复杂度:每执行一次算法的while循环,带搜索的数组大小就减少一半,因此,在最坏的情况下,while循环被执行了O(logn)次。循环体内运算时间O(1),因此整个算法在最坏情况下的计算时间复杂度为O(logn)。

        空间复杂度:该算法并没借助辅助空间,只是对大小为n的数组进行操作,所以为O(1)。

五、心得体会

  在本次实践课上,由两人组成一个小组共同完成实验作业,总的来说还是进行得比较顺利的。会做题不一定会讲题,真正把题能给他人讲清楚才是真正的懂了,老师这种方式能让我们更熟练的掌握所学的分治法。此次实践课打代码效率不是很高,希望下次可以有所进步。

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

  其实分治法对于一些问题来说好像有时候会显得很复杂冗余,就比如第一题,找出最大值,可以直接用比较的方法求出最大值,但是这样子的话时间复杂度就是O(n),而二分法的时间复杂度是O(logn),当问题规模足够大时,二分法会远远优于直接比较的方法。这就说明在设计算法时,代码的复杂程度并不是我们唯一追求的,往往会优先考虑设计效率更加高的算法,即时间复杂度更加低的算法。

posted @ 2021-09-29 20:09  梁惠怡  阅读(34)  评论(0编辑  收藏  举报