434
社区成员
发帖
与我相关
我的任务
分享作业要求:
请以伪代码描述最大字段和的分治算法
分析该算法的时间复杂度
结合本章的学习,你对分治法的体会和思考
int MaxSum(int *a, int left, int right){
int sum = 0;//最大子和段
if (left == right)//处理序列长度为一的情况
sum = a[left] > 0 ? a[left] : 0;
int s1 = 0;
int lefts = 0;
for (int i = mid;i >= left;i--){
lefts += a[i];
if (lefts > s1){
s1 =lefts;
}
}
int s2 = 0;//记录右段最大子和段
int rights = 0;
for (int i = mid + 1; i <= right; i++){
rights += a[i];
if (rights > s2){
s2 = rights;
}
}
sum = s1 + s2;//确定最大字段和
if (sum < leftsum)
sum = leftsum;
if (sum < rightsum)
sum = rightsum;
}
T(n) = 2(n/2) + O(n)
所以时间复杂度为O(nlogn)
分治法思想对于解决现代计算机甚至生活方面的问题都极其重要,将一个大的问题拆解成小问题,如汉诺塔、归并排序等。分治法可以将大问题拆解成小问题,就可以帮助人们更加精准的解决一些复杂问题,再将问题进行合并,这是极其便捷也很重要的思想,需要我们掌握。