算法第二章上机实践报告
1. 实践题目 : 最大子列和问题
2. 问题描述 :
给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
3. 算法描述 :
int maxsum(int *a,int left,int right)
{
int sum=0;
if(left==right)
sum=a[left]>0?a[left]:0;
else{
int mid = (left+right)/2;
int lmax=maxsum(a,left,mid); // lmax表示左边序列中的最大子序列
int rmax=maxsum(a,mid+1,right); // rmax表示右边序列中的最大子序列
int s1=0;
int lefts=0;
for(int i=mid;i>=left;i--){
lefts+=a[i]; // lefts表示从center起到left位置的序列和
if(lefts>s1)
s1=lefts; // s1表示从center起往left位置的最大序列和
}
int s2=0;
int rights=0;
for(int i=mid+1;i<=right;i++){
rights+=a[i]; // rights表示从center+1起到right位置的序列和
if(rights>s2)
s2=rights; // s2表示从center+1起往right位置的最大序列和
}
sum=s1+s2;
if(sum<lmax)
sum=lmax;
if(sum<rmax)
sum=rmax;
}
return sum;
}
4. 算法时间及空间复杂度分析(要有分析过程):
时间复杂度:T(n)= 2T(n/2)+ O(n),由公式得 T(n)= O(nlogn)
空间复杂度:由于在一个数组内就可以完成所有工作,所以空间复杂度O(1)
5. 心得体会(对本次实践收获及疑惑进行总结):
利用分治算法可以将一个大的问题分解为无数个小问题,最后由各个小问题的解得出这个大的问题的解,在这道题中求最大子段和,一开始没什么头绪,后面利用分治算法把求一组数据最大子段和,划分成无数组数据,分别求左右最大子段和,再求跨区域的子段和,比较大小最终得出了这组数据的最大子段和。分治算法可以将一个复杂问题简单化。