算法第2章实践报告

1.实践报告名称:《二分法求函数的零点》

2.问题的描述:

3.算法的描述:

这道题是要通过二分法来求解函数的f(x)的零点。由题目给出的条件我们可以知道在x=1.5(f(1.5)>0)和x=2.4(f(2.4)<0)之间存在唯一一个x值使得f(x)=0,而这个x就是我们要找到的零点,我们可以通过二分法不断紧逼1.5和2.4的中间值,只要保证这个中间值的函数值的绝对值是小于1e-7的,那么最终得到的这个中间值就是我们所求函数的近似零点,这是大概的做题思路。

具体的算法描述如下:首先先定义一个double型的函数fx,然后在main函数下定义double型的left初始化为1.5,right初始化为2.4,使用while循环,判断条件为当left+E<right时,定义mid=(left+right)/2,此时如果mid的函数值大于0,则说明中间值在mid与right之间,将mid赋值于left;否则说明中间值在left和mid之间,将mid赋值于right,循环继续。当循环执行结束时,输出left值。

 

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

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

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

 

5.心得体会

这道题的代码是实验课上和搭档一起敲的,起初对于这道题用二分法一开始我没什么思路,所以也不知道怎么去设计这个算法,然后是搭档画函数图来给我讲解她的思路,我才明白。到最后我敲的代码的判断输出被老师指出问题,也是和搭档一直讨论研究才修正过来。其实结对编程的意义可能更多在于两个人的合作,还有就是让我们互相体会一下对方的解题思路。感觉这样还挺好的,通过课上一起完成的两道代码题,其实能清楚感受到真的收获了不少。

 

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

(1)所谓分治其实就是分而治之,将一个规模为n的问题分解为k个规模较小的问题,每个小问题互相独立并与原问题相同,递归求解这k个小问题,最后将这些子问题的解合并得到这个问题的解;

(2)其实分治法并不是适用于所有大规模问题的求解,有时候有些问题使用分治法反而会增加算法的时间复杂度;

(3)通过这次实验课我更能体会到关于分治法的一些使用,比如临界条件的判断,中间值的查找等这些问题都是分治法使用时需要特别注意的问题,不然很容易造成代码无法通过测试的情况发生

 

posted @ 2021-10-03 11:05  严文文  阅读(12)  评论(0编辑  收藏  举报