zoukankan      html  css  js  c++  java
  • 数据结构作业参考答案(原创)第一周

    一、设有两个多项式形如 m =  a0 + a1x + a2x2 + a3x3 +......anxn,设计算法计算两个多项式的和,输出和多项式。BB平台版本)多项式求和,给出你的方法,并分析效率和原因?f(n) = a0 + a1x + a2x2 + a3x3 +......anxnPPT版本)

    答:

    BB平台版本:

    本题考查比较基础。

    首先,由分析可知我们需要设计的算法的输入为两个多项式的系数。在这里,我们可以把两个多项式的系数分别储存在两个double型的一维数组之中。(由于本题没有明确a的数据类型,这里我们使用double型)值得注意的是:我们讲系数储存的方式是按照顺序存储,这样的话数组标号与系数可以形成对应的关系即多项式系数数组中第y个位置存储的数对应的是xy次方的系数。

    题目要求我们计算两个多项式的和,由多项式的和的计算方法可知我们需要将对应的系数相加即可。(这是因为两个相同次方的单项式求和不可能得到其它次数的单项式)之后按照顺序输出即可。

    题目分析完成之后,以下内容是我实现该算法的伪代码。

    //传入的参数为两个double型的一维数组,我们命名为polynomial1polynomial2

    //设结果的多项式系数数组为ans

    /*

    由题目表述,并不明确两个多项式的最高次数是否一样,如果不同我们将两者中最高次数更大的赋值为n

    小的那个从最高次数+1n的编号对应的数值赋值为0.

    */

    for(int i = 0; i < n; ++i)

    {

    ans = polynomial1[i] + polynomial2[i];

    }

    //输出结果

    for(int i = 0; i < n; ++i)

    {

    打印出ans[i] + xi次方的形式;

    //注:1.如果ans[i] == 0 时不需要打印出,可以加个if语句进行判定

    }

     

    算法时间空间复杂度分析:

    显然可以知道这个算法的时间复杂度为O(n)。对于算法的空间复杂度,我们这里开辟了三个一维数组,数组的大小都是n。可以将ans改成polynomial1这样我们只需要开辟两个一维数组空间即可实现。

    PPT版本:

    本题考查秦九韶算法。

    由分析容易知道,我们可以把一个n次多项式改写为:(...((anx + an-1)x + an-2)x + ... + a1)x + a0。这样我们在计算的时候,v0为最高次的系数。我们按照vn = vn-1x + a0逐层进行计算。我们就把一个n次多项式的问题转化为n个一次多项式的值。

    题目分析完成之后,以下内容是我实现该算法的伪代码。

    /*

    设计函数名称为:求n次多项式值的函数

    传入的参数为double型的一维数组polynomial和多项式的次数n以及需要求值使用的x

    返回值为double型变量ans即求得的值

    */

    for(int i = n-1;i >= 0;i --)

        ans = ans * x + polynomial[i]; //从最高此项开始展开

    return ans //ans为求值后得到的结果

     

    算法时间空间复杂度分析:本题采用高效的算法求解,时间复杂度仅为O(n)

    之开辟了一个数组的存储空间。我们如果将算法写在主函数之中,在输入的过程之中就进行计算,只需要声明一个临时变量可以节约更多的空间。

     

    二、给定一个有nn≥1)个整数的序列,求出其中最大连续子序列之和。例如输入{-211-413-52},那么答案是20,它代表的连续序列是从第2项至第4项。再举一个例子,输入为{1-34-2-16},那么答案是7,这个子序列包括最后4项。

    答:

    本题考查动态规划知识。

    由于求解动态规划问题的关键是我们需要找到状态转移方程。这里我们定义状态数组dp[i](表示a[i]为最后的连续序列之和的最优解)。其中,a为我们输入的代求解的数组。

    分析可以知道dp[i] = dp[i-1] + a[i]只有当dp[i-1] + a[i] >= a[i]的时候才成立。很显然,如果不满足上述不等式,我们取dp[i] = a[i]是最优解。所以我们得到状态转移方程:dp[i] = max(dp[i-1] + a[i], a[i])

    题目分析完成之后,以下内容是我实现该算法的伪代码。

    //传入的数组为a

    int dp[n];

    dp[0] = 0; //分析已知该边界状态为0

    int ans = 0;

    for(int i = 1; i < n; ++i)

    {

    dp[i] = max(dp[i - 1] + a[i], a[i]);

    if(dp[i] > ans) //求出dp[i]中元素的最大值

    {

    ans = dp[i];

    }

    }

    printf("最大子序列之和:%d", ans); //打印出答案

    算法时间空间复杂度分析:本题采用高效的算法求解,时间复杂度仅为O(n)。开辟了两个数组空间消耗也不是特别大。总体来说,利用动态规划算法求解该题的方法是比较理想的解法。

    作者:LightAc
    出处:https://www.cnblogs.com/lightac/
    联系:
    Email: dzz@stu.ouc.edu.cn
    QQ: 1171613053
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    Jest | expect常用匹配方法
    typescript | typeScript 笔记
    好用的思维脑图
    VSCode launch.json 配置详解
    各种语法技术栈文档汇总|api文档集合
    浏览器的运行机制
    js字符串转数字长度限制|超过长度有误差
    css对话框| 气泡框| css箭头
    nginx和php-fpm的用户权限
    mac安装redis拓展
  • 原文地址:https://www.cnblogs.com/lightac/p/12831963.html
Copyright © 2011-2022 走看看