434
社区成员
发帖
与我相关
我的任务
分享1、请以伪代码描述最大字段和的分治算法
int max(int a[],int left,int right)
{
if(left == right) return sum<-max{a[left]||0};
else
{
int mid = (left+right)/2;
sum_left =max(a,left,mid);
sum_right = max(a,mid+1,right);
sum_1 = 0;
left_sum = 0;
for(int i =mid;i>left;i--)
{
left_sum = left_sum + a[i];
sum_1 = max{sum_1,left};
}
sum_2 = 0;
right_sum = 0;
for(int i=mid+1;i<right;i++)
{
right_sum = right_sum + a[i];
sum_2 = max{sum_2,right_sum};
}
sum = sum_1 + sum_2;
sum = max{sum,sum_left};
sum = max{sum,sum_right};
return sum;
}
}
2.分析该算法的时间复杂度
T(n) = O(1) / 2T(n/2)+O(n) = O(n*log n)
3.结合本章的学习,你对分治法的体会和思考
算法第二章主要讲了二分法,顾名思义就是说将给定的数组或者数值范围或者给定的东西进行一分为二。不断地进行一分为二就可以简化问题的复杂度,可以通过不断地解决分开出来地问题。但是二分以后,还有需要不同的操作,需要我们一一甄别。就是说二分是件很机械地东西,但是如何对二分后的东西进行操作,就需要我们进一步的思考。好比日常生活,我们也知道要把事情分成几件事来做,但是对于不同的事情,就要用不同的方法,不能一概而论。