算法第二章实践报告
-
实践题目名称
7-1 maximum number in a unimodal array
-
问题描述
从大小为n的数组中找出最大值(单调递增再递减),由于题目要求时间复杂度为O(log n),所以为分治法。
-
算法描述
本题的时间复杂度为O(log n),采用二分搜索方式对数组不断地二分
若a[mid]大于相邻的两个数,则说明a[mid]就是我们要找的数(因为单峰值函数)
若a[mid]<a[mid-1],则说明峰值在mid的左边,需要缩小范围向mid左边二分
若a[mid]>a[mid+1],则说明峰值在mid的右边,需要缩小范围向mid右边二分
直到找到正确的mid为止
-
算法时间及空间复杂度分析
时间复杂度:每执行一次算法的while循环,带搜索的数组大小就减少一半,因此,在最坏的情况下,while循环被执行了O(logn)次。循环体内运算时间O(1),因此整个算法在最坏情况下的计算时间复杂度为O(logn)。
空间复杂度:该算法并没借助辅助空间,只是对大小为n的数组进行操作,所以为O(1)。
-
心得体会
本次算法上机课,由二人小组共同完成,对两个人帮助都很大,会做题不一定会讲题,真正把题能给他人讲清楚才是真正的懂了。同时,让我们对分治法有了更深刻的认识,意识到了使用它大大减少的时间复杂度,但在做2,3题时仍然面临不少困难,希望以后可以进步。
-
分治法的个人体会和思考
分治法的基本思想就是将一个问题规模为n的问题分解为k个规模较小的子问题,这些子问题规模相同且,互相独立且与原问题相同。总之,通过本次学习,我意识到很多题用到二分搜索会大大减少复杂度,也更为便捷,希望自己今后可以对二分搜索更为熟练。