【软件工程】代码复审与子数组最大和线性算法寻找问题
2014-03-10 20:13
495 查看
【软件工程】代码复审与子数组最大和线性算法寻找问题
[b]小组成员:刘铸辉 何晓楠[/b]
[b]1.子数组最大和线性算法[/b]
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
如果没有O(n)这条要求,那么我们可以通过枚举法,枚举出所有的子数组,然后分别对每个子数组求和,这个规模将达到O(n3).
在课堂上我和铸辉就用了这样的算法。
结果虽然是对的,但是并没有达到老师的要求,课下通过查资料和学习,练习了网上的一些经典的算法以后,理清了O(n)算法的基本思想
O(n)算法的基本思想是依次扫描数组中所有的数,用一个变量sum来保存当前所有子数组和中最大的那个值,用另外一个变量b记录扫描到第i个数的时候,所有子数组的最大值,一旦发现b的值为负数,则将之前的子数组全部抛弃,所以b置为0,直到b的值大于sum的值才更新b为sum的值,当整个数组扫描完毕的时候,所有子数组的最大值也就算出来了。
以下是我们的算法及实现结果。
结果:
其实上面的算法很简单,核心思路就是
当前面的几个数,加起来后,b<0后,
把b重新赋值,置为下一个元素,b=a[i]。
当b>sum,则更新sum=b;
若b<sum,则sum保持原值,不更新。
[b]2.关于代码的复审问题[/b]
1.方法定义太粗糙。(int zuida)
2.通篇没有注释。而且注释是因该随着程序的修改不断更新的。而如果不是这样的话,一个误导的注释可能比没有注释更加糟糕。
3.有些地方其实可以简化代码,比如
4.整体结构还算清晰。
5.给出完整的测试用例应该会更好一些
[b]小组成员:刘铸辉 何晓楠[/b]
[b]1.子数组最大和线性算法[/b]
题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
如果没有O(n)这条要求,那么我们可以通过枚举法,枚举出所有的子数组,然后分别对每个子数组求和,这个规模将达到O(n3).
在课堂上我和铸辉就用了这样的算法。
int zuida(const int A[],int N) { int ThisSum=0 ,MaxSum=0,i,j,k; for(i=0;i<N;i++) for(j=i;j<N;j++) { ThisSum=0; for(k=i;k<j;k++) ThisSum+=A[k]; if(ThisSum>MaxSum) MaxSum=ThisSum; } return MaxSum; }
结果虽然是对的,但是并没有达到老师的要求,课下通过查资料和学习,练习了网上的一些经典的算法以后,理清了O(n)算法的基本思想
O(n)算法的基本思想是依次扫描数组中所有的数,用一个变量sum来保存当前所有子数组和中最大的那个值,用另外一个变量b记录扫描到第i个数的时候,所有子数组的最大值,一旦发现b的值为负数,则将之前的子数组全部抛弃,所以b置为0,直到b的值大于sum的值才更新b为sum的值,当整个数组扫描完毕的时候,所有子数组的最大值也就算出来了。
以下是我们的算法及实现结果。
#include<stdio.h> #include<string.h> #define N 10 int zuida(int a ) { int sum=0; int m=0; int i; int b=0; for(i=0;i<N;i++) { if(b<0) b=a[i]; else b=b+a[i]; if(sum<b) sum=b; } return sum; } void main() { int a ={2,-3,-25,20,13,-5,18,20,-7,-12}; printf("最大子数组的和为%5d\n",zuida(a)); }
结果:
其实上面的算法很简单,核心思路就是
当前面的几个数,加起来后,b<0后,
把b重新赋值,置为下一个元素,b=a[i]。
当b>sum,则更新sum=b;
若b<sum,则sum保持原值,不更新。
[b]2.关于代码的复审问题[/b]
1.方法定义太粗糙。(int zuida)
2.通篇没有注释。而且注释是因该随着程序的修改不断更新的。而如果不是这样的话,一个误导的注释可能比没有注释更加糟糕。
3.有些地方其实可以简化代码,比如
4.整体结构还算清晰。
5.给出完整的测试用例应该会更好一些
相关文章推荐
- 【软件工程】代码复审与子数组最大和线性算法寻找问题
- 算法导论 4.1-5 最大子数组问题 线性时间算法 C++简单实现
- 算法导论-最大子数组问题-线性时间复杂度算法分析与实现
- JAVA代码—算法基础:子数组的最大累加和问题
- JAVA代码—算法基础:最大连续子数组乘积问题
- 最大子数组问题---线性时间算法(转)
- 最大子数组问题的递归和非递归(线性时间)代码
- 算法导论-----最大子数组问题(线性解法)
- 分治策略算法之最大字数组和问题
- 最大子数组问题的分治求解算法
- 寻找数组中的最大值最小值问题
- JAVA代码—算法基础:最大连续邮资问题求解
- 最大子数组问题-c++代码实现及运行实例结果
- 蓝桥杯习题集_ 算法训练 寻找数组中最大值
- 线性时间算法解决最大间隙问题
- 算法训练 寻找数组中最大值 (答案未定,欢迎指教)
- 连续子数组最大和问题(能够处理全是负数,返回子数组的起止索引的O(N)算法)
- 算法训练 寻找数组中最大值
- 蓝桥杯 ALGO-49 算法训练 寻找数组中最大值
- 一种寻找数组中和为最大的子数组的算法