第二章算法作业-实践报告

第二章算法作业

1.实践题目名称:

二分法求函数零点

 

2.问题描述:

有函数: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

(个人理解:简单来说就是求单调函数的根,不过不一定能准确求出该解,但是依题目的提示,只要fabs(f(x))< 1e-7即可)

3.算法描述:

代码:

#include <iostream>

#include <math.h>

#include <iomanip>

using namespace std;

 

double f(double x){

return (x*x*x*x*x-15*x*x*x*x+85*x*x*x-225*x*x+274*x-121);

 

int main(){

 

double left=1.5,right=2.4;

double x;

 

while(fabs(f(x))>1e-7){

 

x=(left+right)/2;

if(f(x)>0) left=x;

else  right=x;

 

}

cout<<setiosflags(ios::fixed)<<setprecision(6)<<left;

}

 

  二分搜索:先取(left+right)/2中间值,如果f(x)>0,证明根在右边,将left=x,继续循环二分搜索,否则在左边,将right=x继续循环直到满足条件。

  循环语句:当fabs(f(x))>1e-7时,做上述所描述的二分搜索,若fabs(f(x))<1e-7时,符合判读条件,说明找到该函数唯一的根。

 

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

算法复杂度:先看While循环,该循环的基本语句为x = (left + right) / 2; 每执行一循环,待搜索的区间大小就会减小一半,在最坏情况下,while循环被执行了O(logn)次,再看循环体内的运算,其赋值语句只要o(1),因此综合起来整个算法的时间复杂度为O(logn)。

该算法是非递归的,且创建的变量只有left,right,x三个变量,所以该算法的空间复杂度为o(1)

 

5.心得体会:

该次实践课采用的是一人打代码,一人先在旁边看自己的搭档打的代码并去理解其意思。我认为在看到题目时一人不要急着马上去打,应该两人先讨论该题所需要我们去干嘛,并且统一思路,防止后续一人打代码一人理解时讨论消耗过多的时间。通过这次的实践课,我对分治法有了更深的了解,也加深了我的熟练程度,并且在与他人合作的同时,也汲取了他人的经验和想法,拓宽了个人的思维,共同进步。

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

分治法就是将一个复杂的问题分成多个相对简单的独立问题进行求解,并且综合所有简单问题的解可以组成这个复杂问题的解,最后合并子问题的街。我认为比较难的部分是分解子问题,在打题过程中我常常不知道如何去分解子问题,以至于难以进行到下一步,后续还需多打题去提升自己。

posted @ 2021-10-10 12:00  Mo莫小鱼  阅读(65)  评论(0编辑  收藏  举报