一 项目负责人
本次实验参与者 操作员尚矫健,领航员节振华。
二 实验过程与实验思路
实验要求找出一个含有负数的整数数组中连续的一个或多个数的和的最大值,并且时间复杂度为O(n),首先这个实验有几个难点,包括怎样求数组的连续的一个或多个数的和并且比较最大值,虽然有点麻烦,但以以往思路还是可以解决的;但实验还要求时间复杂度为O(n),这就要求我们在以思路的基础上寻求创新,以下为我们在实验中寻求突破的思路过程。
实验举例如{5,-3, 2, 4,-6,-1, 3,-4}
首先我们想到的是先将数组求和时一个数,两个数到多个数等情况进行排序,然后再另外创建一个函数进行求和,然后再在刚才的排序中调用此函数,就这样找出各种情况的和,然后将它们进行比较,但是同伴告诉我这样循环中调用一个函数且函数中又有循环,那么这样的时间复杂度将为O(n^2),就这样我们的第一种思路被我们排除了。
其次我们又想到循序渐进的方法,就是循环中求和,但是每次重视加一个数,就这样找出参与数的一个到多个情况的和的最大值,然后这样时间复杂度就会变小,但是考虑到求一个到多个数的和时每次加一个数将会是求和变得麻烦,并且比较最大值时可能还将会有一个排序,就这样这一种方法又被我们排除了。
后来我们想了一种将求和时一个到多个数的各种情况分解的办法,就是先求初一个数时的最大值,这是一个循环,并且时间复杂度为O(n),然后求出连续两个数时和的最大值,这是另一个循环,以此类推,知道求出全部数的和的值,然后再开辟一个循环,求出各种情况下和的最大值,但是因为实验比较麻烦,而且时间复杂度还是为O(n),这种情况也被我们排除了。
最后我们想到的一种情况还是循序渐进的方法,就是先设一个最大值MAX,然后MAX等于第一个大于零的值,且T先等于MAX ,然后由T还是向下加,如果加起来的值小于零,那就从下一个大于零的数重新开始,如果大于零但小于MAX,就接着往下加,但是如果加起来的值大于MAX,就将MAX变为现在的加起来的最大值,以此类推,求出连续的和的最大值,并且这种情况的时间复杂度为O(n),以下为我们编写出的源代码:
#include<iostream.h> int maxzsz(int a[],int length) { int max=0; int t=0; for(int i=0;i<length;i++) { t=t+a[i]; if(t<=0) t=0; if(t>max) max=t; } if(max==0) { max=a[0]; for(int i=1;i<length;i++) if(a[i]>max) max=a[i]; } return max; } void main() { int a[10]={-2,9,-1,5,4,-6,5,2,-2,-4}; cout<<"最大子数组和为:"<<maxzsz(a,10)<<endl; }