算法设计与分析第二章作业

Begin321_ 2022级 2023-10-28 01:41:59

一、请以伪代码描述最大字段和的分治算法

#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) =

 

...全文
40 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

发帖
与我相关
我的任务
社区描述
广东外语外贸大学信息科学与技术学院
算法 高校
社区管理员
  • brisksea
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧