273
社区成员
发帖
与我相关
我的任务
分享
1、请以伪代码描述最大字段和的分治算法
int max(int a[],int left,int right){
if(left == right){
return a[left];
}else{
int mid = (left+right)/2;
Sum-left =max(a,left,mid);
Sum-right = max(a,mid+1,right);
Sum1 = 0;
left_sum = 0;
for(int i =mid;i>left;i--){
left_sum = left_sum + a[i];
sum1 = max{sum1,left};
}
sum2 = 0;
right_sum = 0;
for(int i=mid+1;i<right;i++){
right_sum = right_sum + a[i];
sum2 = max{sum2,right_sum};
}
sum = sum1 + sum2;
sum = max{sum,Sum-left};
sum = max{sum,Sum-right};
return sum;
}
}
2、分析该算法的时间复杂度
假使,最初的问题规模是N,这些小的子问题的个数为a,子问题的规模是是原来的1/b倍,分解或者合并的复杂度表示为f( n ),那么总的时间复杂度就可以表示为
由公式可得,该算法的时间复杂度为O(nlogn)。
3、结合本章的学习,你对分治法的体会和思考
分治法的基本思想就是把一个规模为n的问题分解成k个规模较小的子问题,这些子问题互相独立且与原问题相同。
(1) 将求解的较大规模的问题分割成k个更小规模的子问题。
(2) 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。
(3) 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。
这种思想其实应用很广泛,只是生活中不去特别注意。将一个复杂的且规模庞大的问题通过不断细分不断细分,变成一个个易于理解易于解决的子问题,逐一击破后合并成为最后的解