434
社区成员
发帖
与我相关
我的任务
分享1.请以伪代码描述最大字段和的分治算法
int maxs(int *a, int left, int right) {
if (left == right) {
return a[left] < 0 ? 0 : a[left];
}
int mid = (left + right) / 2;
int leftSum = maxs(a, left, mid);
int rightSum = maxs(a, mid + 1, right);
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 > s1) {
s1 = rights;
}
}
int sum = s0 + s1;
sum = max(sum, leftSum);
sum = max(sum, rightSum);
return sum;
}
int maxSum(int *a, int n) {
return maxs(a, 1, n);
}
2.分析该算法的时间复杂度
T(n)=2T(n/2)+O(n)
T(n)=O(nlogn)
3.分治法
分治法将规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。分治法是很多算法实现的基础,能够帮助我们解决很多大规模的问题。分解子问题时,最好把子问题分解为规模差不多的。