算法-最大子序列和

简介: 最大子序列和的问题,数据结构与算法一书分析中给出了四种算法,最优的算法的时间复杂度为O(N), 1 // MaxSubsequenceSum.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.

最大子序列和的问题,数据结构与算法一书分析中给出了四种算法,最优的算法的时间复杂度为O(N),

 1 // MaxSubsequenceSum.cpp : 定义控制台应用程序的入口点。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 using namespace std;
 7 int MaxSubsequeSum(const int *A,int N)
 8 {
 9     int sumTemp=0;
10     int sumResult=0;
11 
12     for(int index=0;index<N;index++)
13     {
14         sumTemp+=A[index];
15         if(sumResult<sumTemp)
16         {
17             sumResult = sumTemp;
18         }
19         else if(sumTemp < 0)
20         {
21             sumTemp = 0;
22         }
23     }
24     return sumResult;
25 }
26 
27 
28 int _tmain(int argc, _TCHAR* argv[])
29 {
30     int  a[10] = {-1,2,1,-1,1,-3,6,-4,1,-3};
31     cout<<MaxSubsequeSum(a,10)<<endl;
32     return 0;
33 }

算法的正确性分析没有给出过程,分析过程如下:

此算法将整个数组序列分成了不同的子序列,子序列有如下规则

  • 若子序列只有一个元素,那么此元素的值必定为负数
  • 若元素个数n>1,那么第一个元素值sub_array[0]一定为大于0的数,并且最后一个元素sub_array[n-1]必定为小于0的数(如果sub_array[n-1]>=0,因为sum(sub_array[0],...,sub_array[n-2])必定大于等于0,那么sum(sub_array[0],...,sub_array[n-1])>=0,得出sub_array[n-1]不是最后一个元素,矛盾)。
  • 子序列中的最大和值的求出肯定包含第一个元素。

得出最大值有以下两种情况:

  • 子序列中最大值中的最大值,这是上述算法得出的结果。
  • 还有一种可能,最大值可不可能存在两个或者多个相邻子序列中,这里只需要判断两个子序列即可,也就是最大子序列由第一个子序列的结尾部分和第二个子序列组合而成。看下图:第二个子序列最大和值为6,第一个子序列最后一个值为-3,结果为max_sub_array_1_AND_2 = max_sub_array_1 + sub_array_2[n-1]+sub_array_2[n-2]+......其中sub_array_2[n-1]+sub_array_2[n-2]+......>0,但这是不可能的。因为除sub_array_2[0]可能大于|sub_array_2[n-1]|外,其余必定小于|sub_array_2[n-1]|,sub_array_2[n-1]+sub_array_2[n-2]+......必定<0.因此第二种可能是不存在的。


作者: HarlanC

博客地址: http://www.cnblogs.com/harlanc/
个人博客: http://www.harlancn.me/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接

如果觉的博主写的可以,收到您的赞会是很大的动力,如果您觉的不好,您可以投反对票,但麻烦您留言写下问题在哪里,这样才能共同进步。谢谢!

目录
相关文章
|
算法
【算法与数据结构】最大子序列和问题
(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.题目      给定一个数字序列,其中有正有负,确定最大子序列和。用穷举法最好的结果也是时间复杂度O(n²)。后来看到一个聪明的方法,直接使时间复杂度变为O(n)。 2.解法 (1)穷举法        把所有序列都算出来找到最大的。 /* 最大序列和问题的求解,一组数列有正有负
802 0
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真
|
1月前
|
算法
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:移动中位数滤波算法去噪及谱相减算法呈现频谱
23 2
|
1月前
|
算法
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:一维信号NLM非局部均值滤波算法去噪及谱相减算法呈现频谱
39 1
|
4天前
|
机器学习/深度学习 人工智能 算法
基于DCT和扩频的音频水印嵌入提取算法matlab仿真
本文介绍了结合DCT和扩频技术的音频水印算法,用于在不降低音质的情况下嵌入版权信息。在matlab2022a中实现,算法利用DCT进行频域处理,通过扩频增强水印的隐蔽性和抗攻击性。核心程序展示了水印的嵌入与提取过程,包括DCT变换、水印扩频及反变换步骤。该方法有效且专业,未来研究将侧重于提高实用性和安全性。
|
7天前
|
文字识别 算法 计算机视觉
图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正
15 0
|
10天前
|
机器学习/深度学习 算法
【MATLAB】GA_ELM神经网络时序预测算法
【MATLAB】GA_ELM神经网络时序预测算法
282 9

热门文章

最新文章