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

计科2101叶苏琴 2022-09-26 23:48:01

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

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

三、体会和思考

分治法相较于常规遍历法减少了时间复杂度,提高了整体的效率。由此延伸到生活也是,当我们解决一个难题的时候,可以把它分成若干个子问题,求解后再来解决总的问题。

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

273

社区成员

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

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