算法第2章实践报告

1.实践题目名称——《7-2 二分法求函数的零点》

2.问题描述

 

 3.算法描述

这道题主要是通过二分法求解函数f(x)的零点。已知f(1.5)>0,f(2.4)<0,则根据函数的图像性质可知,在1.5和2.4之间必定存在着至少一个零点。根据题意可知,该函数只有一个零点,在1.5和2.4之间。利用二分法,紧逼1.5和2.4得到中间值,保证这个中间值的函数值的绝对值小于1e-7(保证误差足够小以致于可以忽略不计),那么这个中间值就是函数的近似零点。具体做法如下:首先可以自定义一个函数f,用来计算每一个中间值的函数值,并返回结果。把1.5作为left,2.4作为right,中间值mid为(left+right)/2,通过一个while循环调用函数f,如果结果大于0,说明零点在mid和right之间,将left修改为mid;如果结果小于0,说明零点在left和mid之间,将right修改为mid。在循环过程中如果出现符合条件的mid值,则停止循环,并返回这个mid值;否则将一直执行while循环中的代码,当left大于right时,循环结束。

通过以下图片可以更直观地反映如何利用二分法求解:

 

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

(1)时间复杂度分析

在这个算法中,基本语句是mid = (left + right)/ 2,假设n = left + right , 则第一次二分将问题规模缩小到n/2,第二次是n/4……第m次是n/2**m。在最坏的情况下,需要循环的次数m为logn次,因为此时n/2**m等于1,即2**m = n. 所以该算法的时间复杂度为O(logn)

(2)空间复杂度分析

因为该算法是非递归的,辅助空间是常数级别,所以该算法的 空间复杂度为O(1)

5.心得体会

在这次时间中,第一次尝试了两个人一起完成一个编程题,一个人敲,另一个人在旁边看,不仅要看懂同伴敲的代码,而且要能够解释每一行代码的作用。软件工程的老师说,现在很多大厂都采用这种形式让程序员去编写程序,一是为了减少错误,降低回头修正的成本;二是如果一个死了,另一个能够立即顶上去!!!在这次实践过程中,深切体会到了程序员之间沟通和协作的重要性,这种能力在以后工作之后我想会极大地帮助到我们。因为每一个项目都不可能说是一个人去完成的,它往往需要一个小组甚至更多人共同协作才能在规定的时间内将给客户一个满意的答复。我觉得,相比于一个人敲代码,这种方式好像更有趣一点,因为起码跟同伴可以说说话,聊聊天,讨论如何去写下一步代码,出错的时候可以一起想办法解决。所以虽然这次我跟我的同伴花了很长时间才解决掉第一道题,但是总的来说这次的体验还是不错的。当然在这次实践的过程中,还是反映出自身的一些问题,其中最重要的就是编程的能力还是欠佳,归根结底还是打题打得少了,代码接触的也还是远远不够。希望通过这次的反省,好好地提高一下自己的编程能力。

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

(1)我觉得分治法最重要的两个核心问题还是找到分治的数据以及循环的临界条件,找到这两个点才能顺利地设计出正确的算法去解决问题。

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

(3)分治法的运用好像比较广泛,但是并不是所有的问题都适合运用分治法去解决。

posted @ 2021-09-28 20:32  二十三川  阅读(40)  评论(0编辑  收藏  举报