• 软件工程第二次作业


    博客信息 沈阳航空航天大学计算机学院2020软件工程作业
    作业要求 https://edu.cnblogs.com/campus/sau/Computer1701-1705/homework/10583
    课程目标 熟悉一个“高质量”软件的开发过程
    作业目标 单元测试练习

    一.题目要求

    问题: 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n
    例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
    -- 引用自《百度百科》

    二.算法分析

    算法描述如下:
    针对最大子段和这个具体问题本身的结构,我们还可以从算法设计的策略上对上述O(n^2)计算时间算法进行更进一步的改进。从问题的解结构也可以看出,它适合于用分治法求解。
    如果将所给的序列a[1:n]分为长度相等的两段a[1:n/2]和a[n/2+1:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有三种情况:
    (1) a[1:n]的最大子段和与a[1:n/2]的最大子段和相同
    (2) a[1:n]的最大子段和与a[n/2+1:n]的最大子段和相同
    (3) a[1:n]的最大子段和为a[i]+…+a[j],并且1<=i<=n/2,n/2+1<=j<=n。
    对于(1)和(2)两种情况可递归求得,但是对于情况(3),容易看出a[n/2],a[n/2+1]在最大子段中。因此,我们可以在a[1:n/2]中计算出s1=max(a[n/2]+a[n/2-1]+…+a[i]),0<=i<=n/2,并在a[n/2+1:n]中计算出s2= max(a[n/2+1]+a[n/2+2]+…+a[i]),n/2+1<=i<=n。则s1+s2为出现情况(3)的最大子段和。据此可以设计出最大子段和问题的分治算法如下:
    时间复杂度:O(NlogN)

    三.代码实现

    求最大子段和代码

    四.程序运行结

    五.工作记录

    PSP0 工作记录表

    项目 记录结果
    日期 2020-4-4
    开始时间 14:32
    结束时间 15:40
    编码行数 107
    错误数量 1
    错误1 vs2019输入格式错误
    错误1修改时间 20分钟
  • 相关阅读:
    iOS实时查看App运行日志
    Jmeter-使用Ultimate Thread Group插件来设置负载场景
    Flask使用Flask-SQLAlchemy操作MySQL数据库
    使用requests库提交multipart/form-data 格式的请求
    spark 性能调优(一) 性能调优的本质、spark资源使用原理、调优要点分析
    一、spark错误
    sqoop 补充
    Hbase—— rowkey 过滤器(rowfilter)
    spark 调优——基础篇
    scala 的安装 与 IDEA安装使用
  • 原文地址:https://www.cnblogs.com/lylefeng/p/12633120.html
Copyright © 2020-2023  润新知