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

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

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

 

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

目录
相关文章
|
15天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
15天前
|
人工智能 算法 大数据
Linux内核中的调度算法演变:从O(1)到CFS的优化之旅###
本文深入探讨了Linux操作系统内核中进程调度算法的发展历程,聚焦于O(1)调度器向完全公平调度器(CFS)的转变。不同于传统摘要对研究背景、方法、结果和结论的概述,本文创新性地采用“技术演进时间线”的形式,简明扼要地勾勒出这一转变背后的关键技术里程碑,旨在为读者提供一个清晰的历史脉络,引领其深入了解Linux调度机制的革新之路。 ###
|
26天前
|
人工智能 算法 数据安全/隐私保护
基于遗传优化的SVD水印嵌入提取算法matlab仿真
该算法基于遗传优化的SVD水印嵌入与提取技术,通过遗传算法优化水印嵌入参数,提高水印的鲁棒性和隐蔽性。在MATLAB2022a环境下测试,展示了优化前后的性能对比及不同干扰下的水印提取效果。核心程序实现了SVD分解、遗传算法流程及其参数优化,有效提升了水印技术的应用价值。
|
25天前
|
存储 缓存 算法
优化轮询算法以提高资源分配的效率
【10月更文挑战第13天】通过以上这些优化措施,可以在一定程度上提高轮询算法的资源分配效率,使其更好地适应不同的应用场景和需求。但需要注意的是,优化策略的选择和实施需要根据具体情况进行详细的分析和评估,以确保优化效果的最大化。
|
26天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
26天前
|
存储 缓存 算法
前端算法:优化与实战技巧的深度探索
【10月更文挑战第21天】前端算法:优化与实战技巧的深度探索
21 1
|
27天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-LSTM网络的数据分类识别算法matlab仿真
本项目展示了基于贝叶斯优化(BO)的CNN-LSTM网络在数据分类中的应用。通过MATLAB 2022a实现,优化前后效果对比明显。核心代码附带中文注释和操作视频,涵盖BO、CNN、LSTM理论,特别是BO优化CNN-LSTM网络的batchsize和学习率,显著提升模型性能。
|
27天前
|
数据采集 缓存 算法
算法优化的常见策略有哪些
【10月更文挑战第20天】算法优化的常见策略有哪些
|
27天前
|
缓存 分布式计算 监控
算法优化:提升程序性能的艺术
【10月更文挑战第20天】算法优化:提升程序性能的艺术
|
27天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
18 0
下一篇
无影云桌面