软件工程第二次作业
题目要求:最大连续子数组和(最大子段和)
背景问题: 给定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。-- 引用自《百度百科》
选择判定覆盖来设计测试用例。此时要求每个判定的每个可能的结果至少被执行一次。在这个程序中,有一个判定: if (max_ending_here < 0)。需要设计测试用例,确保该判定覆盖所有可能的结果。
输入数组为 {-2, 11, -4, 13, -5, -2}
输入数组为 {-1, -2, -3, -4, -5}
输入数组为 {1, 2, 3, 4, 5}
输入数组为 {0, 0, 0, 0, 0}
输入数组为 {-2, -3, 4, -1, -2, 1, 5, -3}
这些测试用例可以确保对于不同情况下 if (max_ending_here < 0) 判定的覆盖。
通过自动测试:
可以得出测试样例正确。
在本次实验中,主要致力于实现一个计算给定整数序列中最大连续子数组和的算法,并通过选择判定覆盖的方法设计测试用例。虽然实验最终取得了成功,但在实验过程中我们也遇到了一些难题,并找到了相应的解决方法。
遇到的难题:
算法实现难题:在最初实现算法时,可能会考虑简单的遍历方法,但这种方法的效率并不高,对于大规模数据,算法的执行时间可能会非常长。如何设计一个既正确又高效的算法是一个挑战。
测试用例设计难题:选择判定覆盖要求每个判定的每个可能结果至少被执行一次。如何设计这样的测试用例,特别是当数组序列复杂多变时,是一个需要仔细思考的问题。
边界条件处理:在处理数组时,我们需要特别注意边界条件,如数组为空、数组全为负、数组全为零等特殊情况。这些边界条件处理不当可能导致算法出错。
解决方法:
算法优化:经过研究和比较,采用了Kadane算法来求解最大连续子数组和。Kadane算法利用动态规划的思想,通过一次遍历即可得到结果,时间复杂度为O(n),非常高效。
测试用例设计:为了覆盖所有可能的判定结果,设计了多种测试用例,包括正负数混合的数组、全负数组、全正数组、全零数组以及正负交替的数组。这些测试用例确保了 if (max_ending_here < 0) 判定的所有可能结果都被执行至少一次。
边界条件处理:对于边界条件,进行了特殊处理。例如,在算法开始执行前,初始化最大子段和为0,这样可以确保当数组全为负时,算法能正确返回0。同时,在遍历数组时,也特别注意了数组下标的范围,避免出现越界错误。
通过这次实验,我不仅学会了如何设计高效的算法来解决实际问题,还学会了如何使用选择判定覆盖的方法来设计测试用例,以确保算法的正确性。同时,我也学会了如何处理边界条件,避免算法出错。这些经验和教训对我今后的学习和工作都非常有帮助。
代码存放区:https://github.com/Wang-xinrui/-/tree/main
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)