434
社区成员




1.伪代码 int maxSum_2(int a[], int low, int high, int &L, int &R)
{
int mid;
int sum = 0; //记录最大字段
int leftsum = 0; //记录左边最大字段
int rightsum = 0; //记录右边最大字段
int rs = 0; //记录中间部分右边字段的最大字段 int ls = 0; //记录中间部分左边字段的最大字段
int lefts = 0; //记录从中间到最左边的数据之和
int rights = 0; //记录从中间到最右边的数据之和
int i;
int j;
if (low == high)
{
if (a[low] > 0)
sum = a[low];
else
sum = 0;
}
if (low < high)
{
mid = (low + high) / 2;
leftsum = maxSum_2(a, low, mid, L, R); //寻找左边最大字段
rightsum = maxSum_2(a, mid + 1, high, L, R); //寻找右边最大字段
for (i = mid; i >= low; i--)
{
lefts += a[i];
if (ls < lefts)
{
ls = lefts;
L = i;
}
}
for (j = mid + 1; j <= high; j++)
{
rights += a[j];
if (rs < rights)
{
rs = rights;
R = j;
}
}
sum = ls + rs; //sum保存前后两段的最大字段之和
}
if (sum < rightsum)
{
sum = rightsum; //将右边字段设为最大字段
L = mid;
R = high;
}
if (sum < leftsum)
{
sum = leftsum; //将左边字段为最大字段
L = low;
R = mid;
}
return sum;
}
2.时间复杂度
当n=1时,T(n)=O(1)——不需要排序比大小找数
当n>1时,T(n) = 4T(n/2)+O(n)= n的以2为底4的对数次方=O(n^2)
3.体会与思考
分治法即把一个大问题分解成几个子问题,然后逐个分解这些子问题,最后把解决的子问题合成父问题的解。很多涉及数据多、计算量大的问题,若直接按顺序挨个检索效率会很低;如果将此问题分解为小问题,然后进行递归调用,效率就高得多。它本质是一种提高机器办事效率的思路。