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

简介: 输入: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}这个数组,过程是这样的:

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

 

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

目录
相关文章
|
8月前
|
机器学习/深度学习 算法 数据可视化
基于MVO多元宇宙优化的DBSCAN聚类算法matlab仿真
本程序基于MATLAB实现MVO优化的DBSCAN聚类算法,通过多元宇宙优化自动搜索最优参数Eps与MinPts,提升聚类精度。对比传统DBSCAN,MVO-DBSCAN有效克服参数依赖问题,适应复杂数据分布,增强鲁棒性,适用于非均匀密度数据集的高效聚类分析。
|
9月前
|
机器学习/深度学习 传感器 算法
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
【高创新】基于优化的自适应差分导纳算法的改进最大功率点跟踪研究(Matlab代码实现)
396 14
|
8月前
|
机器学习/深度学习 算法
采用蚁群算法对BP神经网络进行优化
使用蚁群算法来优化BP神经网络的权重和偏置,克服传统BP算法容易陷入局部极小值、收敛速度慢、对初始权重敏感等问题。
537 5
|
9月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
477 3
|
9月前
|
canal 算法 vr&ar
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
【图像处理】基于电磁学优化算法的多阈值分割算法研究(Matlab代码实现)
252 1
|
8月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
326 0
|
8月前
|
机器学习/深度学习 算法 物联网
基于遗传方法的动态多目标优化算法
基于遗传方法的动态多目标优化算法
|
9月前
|
机器学习/深度学习 存储 算法
【微电网调度】考虑需求响应的基于改进多目标灰狼算法的微电网优化调度研究(Matlab代码实现)
【微电网调度】考虑需求响应的基于改进多目标灰狼算法的微电网优化调度研究(Matlab代码实现)
381 0
|
9月前
|
存储 边缘计算 算法
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
【太阳能学报EI复现】基于粒子群优化算法的风-水电联合优化运行分析(Matlab代码实现)
178 0

热门文章

最新文章