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

软工2103梁瑞驹 2022-09-22 23:43:43

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

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

伪代码:

#include <iostream>
#include <algorithm>
using namespace std;
int a[10000]; 
int n, temp, sum = 0;
int i;
int lrmaxsum(int l, int r)//单层循环(保证时间复杂度为O(nlogn))求横跨子段的maxsum
{
    int m = (l + r) / 2;
    int lmax = a[m];
    int rmax = a[m + 1];
    //分别以a[m]和a[m + 1]为起点求两段的max值
    temp = 0;//记录数组动态求和的值
    for (i = m; i >= l; i--)
    {
        temp += a[i];
        if (lmax < temp)
            lmax = temp;//记录temp的最大值
    }
    temp = 0;
    for (i = m + 1; i <= r; i++)
    {
        temp += a[i];
        if (rmax < temp)
            rmax = temp;
    }
    return lmax + rmax;
}
int maxsum(int l, int r) //分治法递归求最大子段和maxsum
{
    if (l == r)//只有一个数时maxsum为这个数本身
        return a[l];
    int m = (l + r) / 2;

    //将数组分成两段,则最大子段和对应数组只会出现在以下3个位置:
    //1.左段的子段
    //2.右段的子段
    //3.包含a[m]和a[m + 1]的横跨两段的子段
    //1和2递归调用自身求maxsum,3调用新函数求maxsum

    int lmax = maxsum(l, m);
    int rmax = maxsum(m + 1, r);
    int lrmax = lrmaxsum(l, r);
    return max(lrmax, max(lmax, rmax));//取1 2 3的maxsum的最大值作为最终的maxsum
}
int main()
{
    cin >> n;
    for (i = 0; i < n; i++)
        cin >> a[i];
    sum = max(0, maxsum(0, n - 1)); //最大子段和sum取maxsum和0的最大值,所给的整数均为负数时sum为0
    cout << sum;
    return 0;
}

个人认为单纯的动态规划法在这里更为简单易懂,而且时间复杂度是O(n),在这里记录一下:

#include <iostream>
using namespace std;
int main()
{
    int a[10000];
    int n, sum = 0, temp = 0;
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    for (int i = 0; i < n; i++)
    {
        temp += a[i];
        if(temp < a[i])
            temp = a[i];
        if (sum < temp)
            sum = temp;
    }
    cout << sum; 
    return 0;
}

2.分析该算法的时间复杂度

函数将问题通过m(中间)值将问题分成两段子问题,函数自身处理问题时是一个单层循环,因此有:

T(n) = 2T(n/2) + O(n)

所以算法的时间复杂度为O(nlogn)

3.结合本章的学习,你对分治法的体会和思考

  • 分治法是解决复杂问题的一种方法,大致可以分为 “分” 和 “治” 两方面。
  • “分” 就是把一个复杂的、不能一下子得出答案的问题分成一个个简单的、可以很容易被解决的问题。
  • “治” 就是把一个个已经被解决的简单问题合并,从而得到复杂问题的答案。
  • 通常来说,分治法的时间效率都很高,时间复杂度比较低。但是有时候问题规模比较大时,因为过多的递归调用,空间和时间的效率都会变得很低。
  • 而且,分治法的适用范围也仅限于分解出来的子问题能够很容易就被解决的情况,当子问题的解决依然困难时,分治法就不是那么好用了。
...全文
76 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

434

社区成员

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

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