算法第二章实验报告

一、实践题目名称

二分法求函数的零点

二、问题描述

有函数:f(x)=x^5-15x^4+85x^3−225x^2+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时,f(x)>0,x=2.4时,f(x)<0,且方程的具体解在[1.5,2.4]的范围之间,那么这个函数在定义域[1.5,2.4]的范围内应为单调递减,所以在二分的时候,当f(x)>0时,将中值mid赋给右端的r赋给左端的l,当f(x)<0时相反。这题就是不断地取l,r的中值,进行查找比较,当找到符合使f(x)=0的值时停止,当在一遍查找结束后应将左端加上1e-7来缩小取值范围(或在右端减去),直到找到满足条件的值或l>r时退出循环,输出。

四、算法时间及空间复杂度分析

通过O(1)的操作,将规模为 n 的问题变成了 n/2 的问题。
即:T( n ) = T( n / 2 ) + O( 1 )

所以,T(n)=O(logn)

在整个二分搜索的过程中,一次的话只需要额外存储三个变量:start ,end 和 mid,也因此,空间复杂度是常量O( 1 ) ,但是n次下来,就是O(n)

 

五、心得体会

实践收获:学会了分治算法中的二分查找,利用题目详细深入地去探讨了整个过程,感觉学懂了,知道怎么去写,其实就是一直分一直分下去,缩小范围,向结果逼近,明白了什么条件下取左边地范围,什么条件下取右边的范围。

疑惑总结:二分查找写函数时,那个写不写return的问题,导致运行超时,后来发现都要写才能有返回值。

六、分治法的个人体会和思考

首先,分治法:将原问题划分成n个规模较小而结构与原问题相似的子问题;递归地解决这些子问题,然后再合并其结果,就得到原问题的解。分治模式在每一层递归上都有三个步骤:

分解:将原问题分解成一系列子问题;

解决:递归地解各个子问题。若子问题足够小,则直接求解;

合并:将子问题的结果合并成原问题的解。

分治法特征:

1该问题可以被分割为一定规模后易于求解,并且可以分割为若干子问题;(分治法的基础)

2子问题之间相互独立;

3子问题解决后,合并起来可以得到原问题的解;
(对比动态规划,可以发现,二者十分相似,但是关键点又有不同)

总结:就是当一个问题能够被分解成很多小问题去解决的时候,就用分治法。

posted @ 2021-09-29 23:35  CarinaLing  阅读(67)  评论(0编辑  收藏  举报