算法第二章实践报告

一.实践题目

二分法查找函数的零点

二.问题描述

给定一个函数f(x)及其表达式,并且已知它在闭区间[1.5,2.4]之间有且只有一个根,且f(1.5)>0 , f(2.4)<0 , 要求用二分法求出该函数在区间[1.5,2.4]之间的根。结果保留小数点后六位。

三.算法描述

#include <bits/stdc++.h>

using namespace std;

double f(double x){

         return (pow(x,5) - 15*pow(x,4) + 85*pow(x,3) - 225*pow(x,2) + 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;

}

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

1.算法时间

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

2.空间复杂度

该算法是非递归的,且创建的变量为常数个,所以空间复杂度为O(1)。

五.心得体会

本次实践的打题过程中,加深了我对二分法的掌握程度,对两种使用二分法解答的题型更了解(比如这道题跟“派”那道题,通过二分到小于某个特定值的时候结束二分,我感觉是它们就是同一类的);此外,因为这次实践是两人一起合作完成的,所以在解题的思路上大家各抒己见,各取所长,对拓宽解题的思维方式很有帮助。

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

分治法的基本思想是把一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同,递归地解决这些子问题然后将各子问题的解合并得到原问题的解。在解某些题目的时候,分治法可以大大地提高算法的时间效率,但运用分治法的时候也需要注意,题目是否能够满足它定义里的要求,即可分成若干个相同的、更易解且解可合并的子问题。比如本次实验的最后一题,看到题目时最先想到的是先创建3个数组,然后将两个序列分别存进a、 b数组,然后a数组中的数据与b数组中的数逐一比较,然后把比较完的结果再存进c数组。这个算法虽然很容易想到也很好理解,但它的时间复杂度却是O(n^2),但如果运用分治思想,得到的算法的时间算法复杂度就会远小于前者。所以提高时间效率,是分治法的一大优点,在合适的时候多加利用分治思想,可以很不错地提高我们现阶段的代码质量。

 

posted @ 2021-10-05 14:05  白蔡  阅读(39)  评论(0编辑  收藏  举报