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

计科2101蔡慧琳 2022-09-26 23:30:04
  1. 请以伪代码描述最大字段和的分治算法

    1. 问题描述

      给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。

      要求算法的时间复杂度为O(n)。

    2. 问题分析

      通过分治的思想,可以不断把数组a[1:n]从中间平均分成两个部分:a[1:mid]和a[mid+1: n]两个部分,这样最大字段和出现的位置就会分成三种情况:

      • 最大子段和在左半段
      • 最大子段和在右半段
      • 最大子段和在中间段

      最大子段在左半端与右半端的通过不断递归相加求得,中间通过分别求两边再相加得出,最后再进行比较返回最大的子段和。

    3. 算法实现
    #include<iostream>
    using namespace std;
    int a[10000];
    int MaxSum(int *a, int left, int right)
    {
        int sum = 0, MidSum = 0,LeftSum = 0, RightSum=0;
        int center, s1, s2, lefts, rights;
        if(left == right)
            sum = a[left];
        else{
            center = (left + right)/2;
            LeftSum = MaxSum(a, left, center);       
            RightSum = MaxSum(a, center+1, right);    
            s1 = 0;
            lefts = 0;                          
            for(int i = center;i >= left;i--)          
            {
                lefts += a[i];
                if(lefts > s1) s1 = lefts;
            }
            s2=0;
            rights=0;
            for(int j = center+1;j <= right;j++)   
            {
                rights += a[j];
                if(rights > s2)
                    s2 = rights;
            }
            MidSum = s1+s2;              
            if(MidSum < LeftSum)
                sum = LeftSum;
            else
                sum = MidSum;
            if(sum < RightSum)
                sum = RightSum;   
        }
    
        return sum;
    }
    int main(void)
    {
        int n,j;
        cin>> n;
        for(j = 0;j < n;j++)
            cin>> a[j];
        cout<< MaxSum(a,0,n-1);
        return 0;
    }
    
  2. 该算法的时间复杂度

    划分子问题:O(1)

    求解子问题:2T(n/2)

    合并子问题:O(n)

    所以T(n) = 2T(n/2)+O(1)+O(n)

    所以该算法的时间复杂度为T(n) = O(nlogn)

  3. 分治法的体会与思考

    ​ 分治算法的核心思想可以归结为四个字:分而治之。分治法将规模为n的问题不断缩减,划分子问题,分成k个规模为n/m的我们比较容易能解决的子问题,这些子问题相互独立且与原问题性质相同,最后求出的小规模问题的解合并为更大规模的解,自底向上逐步合并求出原问题的解。

...全文
107 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统中变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研中的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文中提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

434

社区成员

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

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