算法第2章实践报告

Posted deerrrrr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法第2章实践报告相关的知识,希望对你有一定的参考价值。

  1. 实践题目名称

  二分法求函数的零点

  1. 问题描述

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

  1. 算法描述

  本题我们采用二分法递归求解。

由题意可得:f(x)在区间[1.5,2.4]上单调递减。首先,我们取start=

1.5,end=2.4,mid=(start+end)/2,判断f(mid)的取值情况,临界情况是:fabs(f(mid))<1e-7,直接找到根,返回mid;若f(mid)>0,则下一个求根区间变为[mid,end]f(mid)<0,则下一个求根区间变为[start,mid]不断重复以上操作,不断进行二分操作,直到递归结束最后用setprecision(6)<<std::fixed保留小数点后6位输出mid

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

   (1)时间复杂度

本题我们用二分法将一个大规模问题n分解为两个小的子规模,子规模变为n/2,由于只需要处理其中一个子规模问题,所以该算法时间复杂度为T(n/2)=O(log n)由于最后不需要进行合并子问题,所以我们只需要考虑一开始的函数输入,时间复杂度为O(1)

合并起来时间复杂度为O(log n)+O(1)=O(log n)

   (2)空间复杂度

在整个二分搜索的过程中,只需要额外存储三个变量:start ,end 和 mid,所以空间复杂度是O(1)

  1. 心得体会

(1) 本次实践收获

进一步加深了对二分法求解问题的理解,以后面对大规模的问题是可以根据实际情况使用该方法解决,降低时间复杂度。

(2) 疑惑

在递归过程中,不写return会超时,但是好像可以运行,有点不理解为什么会这样,感觉是一定要写return的。

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

分治法适用于将大规模的子问题分解成若干个小规模子问题,并且小规模子问题更容易求解、若干个小规模子问题之间互相独立、和大规模问题的性质是一样的,分治法分为三个步骤:

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

解决:递归地解各个子问题。

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

算法第3章上机实践报告

算法第3章上机实践报告

一、 实践题目:7-2 最大字段和

二、 问题描述:

给定n个整数(可能为负数)组成的序列a[1], a[2], a[3]...,a[n],求该序列和如a[i] + a[i + 1] + .... + a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0

要求算法的时间复杂度为O(n)

三、 算法描述

在除去所有数都是负数的特殊情况后,从0开始遍历数组,每向前一个数,得到第0~i个子序列,以及一个极大字段和(分为两种情况1.将第i-1的最大字段和加上第i个数,得到第0~i子序列的极大字段和。2.将第i个数直接作为极大字段和。比较12两种情况的大小求出0~i的极大字段和),将极大字段和与一直所记录的最大字段和进行比较,最终得到最大字段和并输出。

四、 算法实践及空间复杂度分析(含分析过程)

1.算法实践

#include <stdio.h>

int n, tmp = 0, sum = 0;
int a[10005];

int main(){
    scanf("%d", &n);
    int f = 0;
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        if (a[i] >= 0)
            f = 1;
    }
    if (f == 0) {
        printf("0
");
        return 0;
    }    // 全部都为负数 
    
    for (int i = 1; i <= n; i++) {
        if (tmp > 0){
            // 0~i-1的极大字段和为正数
            tmp += a[i];
        }    // 情况一:0~i-1的极大字段和 + a[i] 
        else {
            tmp = a[i];
        }    //  情况二:极大字段和 = a[i] 
        if (tmp > sum){
            sum = tmp;
        }    
    }    // 有一点tricky,此方法与本题比较相关 
    
    printf("%d
", sum);
    return 0;
}

2.空间复杂度分析:O(n)

五、 心得体会(含本次实践收获及疑惑进行总结)

1.在上机课讲解队友代码的时候不要过于紧张,要看清想清题目再回答问题。

2.认真审题,及早发现特殊样例。

3.想清楚题目,举例确定算法。

六、 参考链接

1.https://blog.csdn.net/Loi_imcy/article/details/52693372?locationNum=15

2.https://blog.csdn.net/y1196645376/article/details/42121307

3.https://blog.csdn.net/iamjingong/article/details/69297619

以上是关于算法第2章实践报告的主要内容,如果未能解决你的问题,请参考以下文章

算法第4章实践报告

算法第4章实践报告

算法第4章实践报告

算法第4章实践报告

算法第3章上机实践报告

算法第五章上机实践报告