273
社区成员
一、请以伪代码描述最大字段和的分治算法
伪代码如下:
int maxSubSum(int *a, int left, int right) {
if (left == right) {
return a[left] < 0 ? 0 : a[left];
}
int centor = (left + right) / 2;
int leftSum = maxSubSum(a, left, centor);
int rightSum = maxSubSum(a, centor + 1, right);
int s1 = 0;
int lefts =0;
for (int i = centor; i >= left; i--) { // 从中点向左找最大字段和
lefts += a[i];
if (lefts > s1) {
s1 = lefts;
}
}
int s2 = 0;
int rights = 0;
for (int i = centor + 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 sumSubSum(a, 1, n); // 可以根据数组a自行调整
}
二、分析该算法的时间复杂度
假使,最初的问题规模是N,这些小的子问题的个数为a,子问题的规模是n / b,分解或者合并的复杂度表示为f( n ),那么总的时间复杂度就可以表示为
由公式可得,该算法的时间复杂度为O(nlogn)。
三、结合本章的学习,你对分治法的体会和思考
分治法将一个问题分成大小相等的k个子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题合并得到原问题的解。大大地优化了算法运行的时间复杂度,这种“分治”的思想也启发我们运用到平时某些问题的解决方案中。