标签:时间 了解 字段 最大 编写 分析 htm 算法 定义
1.实践题目:最大子列和问题
2.问题描述:
给定K个整数组成的序列{ N1, N2 , ..., NK},“连续子列”被定义为{ N?i , Ni+1 ,..., Nj},其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。
3.算法描述:
运用分治法,分析问题得出最大子列和的分布有三种情况:(1)左子序列;(2)右子序列;(3)位于中部的横跨左右的子序列。
递归结束的条件:left=right,若left>0,则返回a[left],否则返回0。
依次得出左子序列的最大子列和,右子序列的最大子列和,横跨左右的子序列的最大子列和,并比较得出最大者。
4.算法时间及空间复杂度分析:
设用T(n)表示解决该问题所需的时间,分解子问题所需时间为O(1),对该问题分成2个规模为n/2的子问题则所需时间为2T(n/2),合并子问题所需时间为O(n);
{O(1)
则T(n)={2T(n/2)+O(n)
由于a=2, b=2, d=1,得到d=logb a
所以时间复杂度为O(nlogn)
5.心得体会:
刚开始写的时候发现了一个问题,如:
int leftmaxsum=Maxsum(a, left, mid);//左序列最大字段和
int rightmaxsum=Maxsum(a, mid+1, right);//右序列最大字段和
这是正确的写法,以下是我刚开始写的错误写法
int leftmaxsum=Maxsum(a, left, mid-1);//左序列最大字段和
int rightmaxsum=Maxsum(a, mid, right);//右序列最大字段和
这会导致当left=0,right=1时,mid-1=-1越界的情况
同时也在网上了解到动态规划的方法,时间复杂度为T(n)=O(n),在此题的限制下两者差不太多
标签:时间 了解 字段 最大 编写 分析 htm 算法 定义
原文地址:https://www.cnblogs.com/Sullivan2333/p/13765638.html