算法第二章上机实践报告

算法第二章上机实践报告

1.实践题目名称:

7-2 二分法求函数的零点 (30 分)

2.问题描述:

有函数:f(x)=x515x4+85x3225x2+274x−121 已知f(1.5)>0,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。提示:判断函数是否为0,使用表达式 fabs(f(x)) < 1e-7,即当求解过程中,把根所在的区域范围缩小到1e-7以下就可以当作是找到了方程的根了。

3.算法描述

整体的思路是在题目所给的范围[1.5,2.4]内求中间值mid对应的函数值f(mid)的正负情况,再根据f(1.5)>0,f(2.4)<0,来截取更小的范围,即取与f(mid)相乘异号的范围。如果f(mid)*f(1.5)<0,范围将缩小到(1.5,mid);如果f(mid)*f(2.4)<0,范围将缩小到(mid,2.4),以此类推,用二分法无限缩小范围知道范围足够小,小到1e-7为止。写成代码可以用循环,也可以用递归。

注意:因为求解根的过程中要多次将不同的自变量x带入到函数表达式求值,所以为了方便可以写一个函数,方便书写。

 

 

 

递归求解:

 

 

4.算法时间及空间复杂度分析(要有分析过程)

算法的时间复杂度:算法用二分法思想求解,无需合并子问题,分解问题的时间复杂度为O(1),解决子问题的时间复杂度为O(n/2),所以总的时间复杂度为O(n)=O(n/2)+O(1)=O(logn)

空间复杂度:递归算法的空间复杂度:递归深度*每次递归所要的辅助空间,这里的空间复杂度就等于S(n)=S(logn)*4=S(logn)

5.心得体会(对本次实践收获及疑惑进行总结)

本次实践,我大部分时间是因为我和搭档都理解错了题目而浪费掉了,并且没弄清楚递归的条件,改用循环去做题的时候才重新思考得出了答案。在这次实验中,我懂得了,做题之前要充分理解,读懂题目,分析解题思路,而不是走一步看一步地闷头就写代码。同时也从搭档身上学到了很多,比如特殊情况下特殊处理,代码要写得整洁规范等等。经过与队友的合作,也发现了我身上的一些问题,并努力向队友学习。

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

分治法主要由二分思想来做题,可以用循环也可以用递归来实现,它们的共同点就是要时刻清楚判断的条件,和根据题目对不同情况做出不同调整。在时间复杂度上,循环算法要优于递归算法,虽然递归可以使程序看起来比较简洁,但是缺点是效率比较低,并且可能导致栈溢出,当需要计算的数稍大一点,就需要很长的计算时间,就像实验题第三题求两个有序序列的中位数时,对于最大的N=100000时,需要时间较长,因此我们要灵活使用递归,做好在循环与递归之间的选择。

 

posted @ 2021-10-04 20:00  寥寥晨曦  阅读(153)  评论(0编辑  收藏  举报