张~~

 

算法第二章上机实践报告

1. 实践题目 : 最大子列和问题

 

2. 问题描述 : 

给定K个整数组成的序列{ N1​​, N2​​, ..., NK​​ },“连续子列”被定义为{ Ni​​, Ni+1​​, ..., Nj​​ },其中 1ijK。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -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. 心得体会(对本次实践收获及疑惑进行总结):

利用分治算法可以将一个大的问题分解为无数个小问题,最后由各个小问题的解得出这个大的问题的解,在这道题中求最大子段和,一开始没什么头绪,后面利用分治算法把求一组数据最大子段和,划分成无数组数据,分别求左右最大子段和,再求跨区域的子段和,比较大小最终得出了这组数据的最大子段和。分治算法可以将一个复杂问题简单化。

 

posted on 2020-10-10 22:50  张~~  阅读(185)  评论(0编辑  收藏  举报

导航