连续向量最大和(一维模式识别)算法的分析与优化

简介: 输入:n个互相没有关联的数字(正负随机) 输出:该数组中连续数字的最大和     如在数组3 -4 5 2 -5 5 9 -9 -2 8中,连续数字最大和为5 2 -5 5 9这个数字序列的和,最大和为16 一、简单迭代算法    遇到这种问题,头脑中冒出的最直接最简单的就是这种算法。

输入:n个互相没有关联的数字(正负随机)

输出:该数组中连续数字的最大和

    如在数组3 -4 5 2 -5 5 9 -9 -2 8中,连续数字最大和为5 2 -5 5 9这个数字序列的和,最大和为16

一、简单迭代算法

    遇到这种问题,头脑中冒出的最直接最简单的就是这种算法。用一个双重循环,一个代表起始位置,一个标注末尾,计算其中元素的和,在与最大值比较,得出新的最大值。

  1. for(int i = 0;i<N;i++)  
  2.     {  
  3.         int sum = 0;  
  4.         for(int j = i;j<N;j++)  
  5.         {  
  6.             sum += arr[j];  
  7.             max = MAX(sum,max);  
  8.         }  
  9.     }

    对于输入规模n来说,该解法会执行n^2步,所以该算法为平方时间。

二、动态规划的迭代算法

    我们可以用一个数组sum[i],代表前i个整数和这样一种状态。所以后一个状态就由前一个状态加arr[i]得到,而两个状态相减则得到了两个整数中间数的和。

  1. for(int i = 1;i<N;i++)  
  2.     sum[i] = sum[i-1]+arr[i];  
  3.     
  4. for(int i = N-1;i>=0;i--)  
  5.     for(int j = i;j>=0;j--)  
  6.     {  
  7.         int sum1 = sum[i] - sum[j];  
  8.         max = MAX(max,sum1);  
  9.     }  

    对于输入规模n来说,该解法会执行n^2步,所以该算法仍然为平方时间。

三、分治算法

    将一个数组的最大和问题转换为两个数组的最大和问题,然后递归的找出两个向量的最大和。不过要考虑一种情况就是和最大的那一组数组可能跨越两个子数组的边界,所以需要对边界的数组进行处理。对于跨越边界的问题,分别在两个数组中从边界开始,计算边界的最大和,再将两个边界最大和相加,与子数组的最大和比较。

  1. float maxsum3(int l,int u)  
  2. {  
  3.     if(l>u)  
  4.         return 0;  
  5.     if(l == u)  
  6.         return MAX(0,arr[l]);  
  7.     int m = (l+u)/2;  
  8.         
  9.     int lmax = 0,sum = 0;  
  10.     for(int i = m;i>=l;i--)  
  11.     {  
  12.         sum += arr[i];  
  13.         lmax = MAX(lmax,sum);  
  14.     }  
  15.         
  16.     int rmax = 0;  
  17.     sum = 0;  
  18.     for(int i = m+1;i<=u;i++)  
  19.     {  
  20.         sum += arr[i];  
  21.         rmax = MAX(rmax,sum);  
  22.     }  
  23.         
  24.     return max((float)lmax+rmax,maxsum3(l,m),maxsum3(m+1,u));  
  25. }  

    可以看到子数组求值的方向都是从边界(中间)向两边展开的。

    该算法每次执行n次操作,递归总共有log n次,所以时间复杂度为O(n lon n)。

四、扫描算法

    在这个问题中,正负数随机出现,所以我们默认在一个较长的数组里,最大和是大于零的。对一个元素不多的数组进行直觉运算时,我们总是习惯于从左往右开始扫描数字,当发现几个数字的和小于0时就直接略过前面的数字,从新位置开始扫描,并记录下出现过的最大值,直到扫描完整个数组。1977年,当这个问题(模式匹配)被布朗大学的Grenander提出时,他独立设计出了两个平方算法。后来他将问题讲给Michael Shamos听,后者提出了分治算法。那时,他们俩都认为没有更好的算法了,直到后来Michael Shamos在卡耐基——梅隆大学的一次研讨会上提起了这个问题,而参会的一个统计学家Jay Kadane在一分钟内就设计除了线性时间的扫描算法。不过这下,应该不会再有更优的算法了,毕竟任何算法都至少要花费O(n)的时间。

  1. int maxsofar = 0,maxendinghere = 0;  
  2.     
  3. for(int i = 0;i<N;i++)  
  4. {  
  5.     maxendinghere = MAX(maxendinghere+arr[i],0);  
  6. printf("%d %d",i,maxendinghere);   
  7.     maxsofar = MAX(maxsofar,maxendinghere);  
  8. printf(" %d\n",maxsofar);  
  9. }  
  10. printf("%d",maxsofar);  

    对于{3,-4,2,5,-5,5,9,-9,-2,8}这个数组,过程是这样的:

    线性时间的算法,效率嘛,谁用谁知道。

 

注:四个算法的代码在最大和详细代码

目录
相关文章
|
16天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
16天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。
|
2天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
11 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
8天前
|
机器学习/深度学习 算法
深度学习中的优化算法:从梯度下降到Adam
本文深入探讨了深度学习中的核心——优化算法,重点分析了梯度下降及其多种变体。通过比较梯度下降、动量方法、AdaGrad、RMSProp以及Adam等算法,揭示了它们如何更高效地找到损失函数的最小值。此外,文章还讨论了不同优化算法在实际模型训练中的表现和选择依据,为深度学习实践提供了宝贵的指导。
26 7
|
24天前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
18天前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
117 1
|
20天前
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理
|
3天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于PSO粒子群优化的GroupCNN分组卷积网络时间序列预测算法matlab仿真
本项目展示了一种结合粒子群优化(PSO)与分组卷积神经网络(GroupCNN)的时间序列预测算法。该算法通过PSO寻找最优网络结构和超参数,提高预测准确性与效率。软件基于MATLAB 2022a,提供完整代码及详细中文注释,并附带操作步骤视频。分组卷积有效降低了计算成本,而PSO则智能调整网络参数。此方法特别适用于金融市场预测和天气预报等场景。
|
4天前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法
本文将探讨深度学习中的几种常见优化算法,包括梯度下降、动量方法、AdaGrad、RMSProp和Adam。这些算法在训练神经网络时发挥着重要作用,通过调整学习率和更新策略,能够显著提高模型的训练效率和性能。了解这些优化算法有助于更好地应用深度学习技术解决实际问题。
|
12天前
|
算法 Python
群智能算法:灰狼优化算法(GWO)的详细解读
在优化问题中,寻找最优解是核心目标。灰狼优化算法(GWO)受到自然界灰狼狩猎行为和社会等级结构的启发,通过模拟Alpha(头狼)、Beta(助手狼)、Delta(支配狼)和Omega(普通狼)的角色,高效搜索最优解。本文详细解析GWO的原理与步骤,并提供Python代码实现,帮助读者理解并应用这一算法。