434
社区成员
发帖
与我相关
我的任务
分享一、请以伪代码描述最大字段和的分治算法
#include <iostream>
using namespace std;
int maxSubSum(int arr[], int left, int right)
{
int sum = 0;
if (left == right)
return (arr[left] > arr[right] ? arr[left] : arr[right]);
else
{
int centre = (left + right) / 2;
int leftsum = maxSubSum(arr, left, centre);
int rightsum = maxSubSum(arr, centre + 1, right);
int midsum1 = 0;
int lefts = 0;
for (int i = centre; i >= left; i--)
{
lefts += arr[i];
if (lefts > midsum1)
midsum1 = lefts;
}
int midsum2 = 0;
int rights = 0;
for (int j = centre +1; j <= right; j++)
{
rights += arr[j];
if (rights > midsum2)
midsum2 = rights;
}
sum = midsum1 + midsum2;
if (sum < leftsum)
sum = leftsum;
if (sum < rightsum)
sum = rightsum;
return sum;
}
}
int main()
{
int n;
cin >> n;
int arr[10001];
for (int i = 0; i < n; i++)
{
cin >> arr[i];
}
cout << maxSubSum(arr, 1, n);
return 0;
}
二、分析该算法的时间复杂度
T(n) =
当问题规模为1时,时间复杂度为1;当问题规模大于1时,每次将问题划分为两个子问题2T(n / 2),然后再合并O(n),由递归不等式得,该算法的时间复杂度为O(n)。
三、结合本章的学习,你对分治法的体会和思考
①分治法的基本思想就是将原问题划分为一个个的子问题,子问题与原问题互相独立且相同,用递归先求解出子问题,再进行合并,从而得到原问题的解。(先分后合)
②用分治法时,要清楚划分的最小单位是什么。
③用递归不等式求解算法的时间复杂度也很重要。
T(n) = aT(n / b) + o()
T(n) =