算法第二章实验报告
实践题目:7-2 二分法求函数的零点
1、问题描述
有函数:f(x)=x5−15x4+85x3−225x2+274x−121 已知f(1.5)>0,f(2.4)<0 且方程f(x)=0 在区间[1.5,2.4] 有且只有一个根,请用二分法求出该根。 提示:判断函数是否为0,使用表达式 fabs(f(x)) < 1e-7
输入格式:
无。
输出格式:x
该方程在区间[1.5,2.4]中的根。要求四舍五入到小数点后6位。
2、算法描述
思路:利用二分搜索方法,在符合判断条件前(区间间距大小大于1e-7)不断地缩小middle的定义域。
- 当f(x)>0时,则令x=middle赋给left;
- 当f(x)<0时,则令x=middle赋给right;
- 当f(x)=0时,停止递归,输出middle。
3、复杂度分析
时间复杂度:
——最好情况:
一次就恰好符合判断条件时为O(1)
——一般情况:
当一共有n个元素时,每次将元素分成两份(参照二叉树),也就是给每一层的子叶做除法,除以2,一直分到子叶为1。
2^x = n
X=log2n
因此为O(logn)
空间复杂度分析
每次只需middle来辅助查找判断,因此空间复杂度为O(1)。
4、心得体会:
本次实践中我颇有收获,分为团队合作的感悟与分治法的感悟。
团队合作:
通过这次实践课的团队合作,我发现了思路的多样性和代码呈现形式的多样性。每个人的思考与解决问题的方式都各异,但我认为只要是思考了,敢于表达,就离成功靠近一步了。不去评判这个思考结果的好坏,反而应该鼓励多向思考,因此团队合作能更好的拓展自己的思路,发现自己逻辑上的不足之处,正所谓“有则改之无则加勉”。
分治法:
分治法也就是“分而治之”,将大规模的问题拆分成若干个小问题(子问题),再逐步解决子问题,最后将子问题的解合并。这种方法比单一的递归循环效率要高。