算法第2章实践报告

算法第2章实践报告

1.实践题目名称

7-1 maximum number in a unimodal array

 

2.问题描述

该题就是要在一个数值先单调递增然后再单调递减的整数数组里找到最大值并输出,且要求时间复杂度在O(log n)。

 

3.算法描述

因为该数组存在一个峰值,而题目要求找到的也是这个峰值,并且为了减少时间的开销、降低时间复杂度,我们可以采用二分搜索的方式进行查找。我们先定义一个整型数组,然后给数组赋值,然后再采用二分搜索的方式找到最大值。

首先记当前数组的第一个元素下标为low,最后一个元素的下标为high,中间元素的下标为mid,并且mid=(low+high)/2,然后开始二分搜索。

二分搜索能进行的前提是low<=high,所以在每次进行二分搜索前先判断是否满足该条件。

a[mid]>a[mid+1]并且a[mid]>a[mid-1]时,a[mid]就是最大值,直接返回结果;

当只满足a[mid]>a[mid+1]时,则证明此时已经过了峰值,所以这时候需要往回找,因此为了缩小范围,high=mid-1;

当只满足a[mid]<a[mid+1]时,则证明还没到峰值,此时需要往后找,所以此时low=mid+1;

然后一直循环判断,直到找到为止。

 

4.算法时间及空间复杂度分析

时间复杂度分析:因为本题采用的是二分搜索的方式,每次搜索完当前数组的长度都减少一半,所以时间复杂度为O(log n)。

空间复杂度分析:

本题只用了一个数组存放数据,并没有用到辅助空间,所以本题的空间复杂度为O(1)。

 

5.心得体会

在本次的实践课中,相对来说还是进行的比较顺利的,在和搭档的配合下完成了两道题目。在这次的实验课中,我对分治法有了更进一步的运用,也对分治法更加的熟悉,体会到了分治法的好处。在本次的实践中,还是碰到了一点难题,就是二分法求函数的零点,我把代码提交上去的时候,系统显示运行超时,然后我便稍微修改了一下就可以了,但是我感觉它们之间并没有很大的差别,我也不太清楚其中的原由。但我后来思考了一下,可能是函数的原因吧。

 

6.分治法的个人体会和思考

在学习分治法的这段时间,我对分治法有了进一步的了解,也对分治法的应用了解的更多了。利用分治法可以将一个大问题拆分成一个个本质相同的小问题,这样可以大大的提高解决问题的效率,可以缩短解决问题所需要的时间,即减小时间复杂度。分治法包括的范围很大,包括:归并排序、快速排序等等,其中在解题过程中我运用最多的就是二分搜索了。但其实虽然分治法的例子有很多,但针对每个问题,分和合的过程都是不同的,不同问题的分解合并过程可以没有任何关系。所以,分治法还是很值得我们细细去思考和探究的。

posted @   Linqylin  阅读(49)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示