434
社区成员
发帖
与我相关
我的任务
分享1.以伪代码描述最大字段和的分治算法
用分治法求解这个问题,在数组的 mid = (right-left)/2+left 位置处分开,形成两个子数组。那么,最大子段和可能出现在三个位置:
a. 可能出现在左子数组[1:n/2]
b. 可能出现在右子数组[n/2+1:n]
c. 可能出现在过mid的中间某部分元素组成的子数组。
伪代码如下
int find(int a[],int left,int right)
{
if(left==right)
{
return a[left];
}
int mid = (left + right) / 2;
if(mid == 0)
{
return 0;
}
int maxNum = max(findMax(a, left.mid), findMax(a, mid+1, right));
int j = 0, L = a[mid - 1], R = a[mid];
for(int i = mid-1; i >= left; --i)
{
L = max(L,j+=a[i]);
}
j = 0;
for(int i = mid; i <= right; i++)
{
R = max(R, j += a[i]);
}
return max(maxNum,L+R);
}
2.分析该算法的时间复杂度
① 分解子问题:O(1);
② 求解子问题: 2T(n/2);
③ 合并子问题:O(n);
因此由主定理得时间复杂度T(n) = O(1) + 2T(n / 2) + O(n) = O(nlogn)。
3.对分治算法的体会与思考
分治法求解问题的过程是,将整个问题分解成若干个小问题后分而治之。
运用分治法拆解一个大问题, 能更为方便而高效率地解决一些问题,并能够化简问题,令解题思路更为明确。