273
社区成员
发帖
与我相关
我的任务
分享
一、请以伪代码描述最大字段和的分治算法
#include <iostream>
using namespace::std;
const int maxn = 300000;
int a[maxn];
int FindMax(int a[],int left,int right){
if(left == right){
return a[left]; //只有一个元素,直接返回
}
int center = (left + right)/2;// center为0直接返回
if(center == 0) return 0;
//递归求解左右区间的最大值
int Max = max(FindMax(a, left, center), FindMax(a, center + 1, right));
int j = 0,L = a[center-1],R = a[center];
for(int i = center - 1;i >= left;--i){
L = max(L, j+=a[i]); // 左区域的最大字段和
}
j = 0; //清空之前的j
for(int i = center;i <= right;++i){
R = max(R, j+=a[i]); // 右区域的最大字段和
}
return max(Max, L+R); //合并求解
}
int main() {
int n;
cin >> n;
for(int i=0;i<n;i++)
cin >> a[i];
int left = 0,right = sizeof(a)-1;
int Max = FindMax(a, left, right);
cout << Max;
return 0;
}
二、分析分治算法的时间复杂度
划分子问题的时间复杂度为O(1),求解子问题求左右区间最大的字段和为2T(n/2),合并子问题为O(n)
由此,总的时间复杂度为T(n)= 2T(n/2)+O(n)=O(nlogn)。
三、体会和思考
分治法相较于常规遍历法减少了时间复杂度,提高了整体的效率。由此延伸到生活也是,当我们解决一个难题的时候,可以把它分成若干个子问题,求解后再来解决总的问题。