博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
K:求取数组中最大连续子序列和的四个算法
阅读量:7223 次
发布时间:2019-06-29

本文共 2995 字,大约阅读时间需要 9 分钟。

相关介绍:

 求取数组中最大连续子序列和问题,是一个较为“古老”的一个问题。该问题的描述为,给定一个整型数组(当然浮点型也是可以的啦),求取其下标连续的子序列,且其和为该数组的所有子序列和中值为最大的。例如数组A={1, 3, -2, 4, -5},则最大连续子序列和为6,即1+3+(-2)+ 4 = 6。解决该问题的算法有四种,根据其时间复杂度的高低,下面分别为这四种算法做介绍。

第一种:时间复杂度为O(N^3)

 该算法也是最容易想到的,很直观的算法,其算法的思路为,穷举数组中以某个元素为起始元素,以另一个元素为终止元素的元素子序列的和,并记录找出的子序列和最大的那个值

示例代码如下:

/** * 用于演示O(N^3)的算法 * @param array 用于寻找最大连续子序列和的数组 * @return 最大连续子序列和的值 */public int maxSubN3(int[] array){    int result=0;    int length=array.length;    //用于控制子序列的起始下标    for(int i=0;i

第二种:时间复杂度为O(N^2)

 该算法通过对上面算法的实现方式进行改进,从而降低了时间复杂度。该算法的思路同上一个的大致相同,但是注意到,每次将终止元素的下标往后移动一位的时候,其子序列和又重新计算了一遍。为此,可以通过保留其上一次从起始元素到终止元素的之间的子序列和的计算结果,来减低时间复杂度。

示例代码如下:

/** * 用于演示O(N^2)的算法 * @param array 用于寻找最大连续子序列和的数组 * @return 最大连续子序列和的值 */public int maxSubN2(int[] array){    int length=array.length;    int result=0;    for(int i=0;i

第三种:时间复杂度为O(NlogN)

 采用分治的思想,将数组划分为两半,最大连续子序列和出现的地方只可能有三种,要么在数组的左半边,要么在数组的右半边,要么横跨了数组的左右半边,同时其必定包含数组左半边的右边界以及数组右半边的左边界

/** * 用于演示O(NlogN)的算法 * @param array 用于寻找最长子序列的数组 * @return */public int maxSubNlogN(int[] array){    return maxSubNlogN(array,0,array.length-1);}/** * 用于递归的那个方法,low和high为数组的左右边界 */private int maxSubNlogN(int[] array,int low,int high){    //当只剩下一个数组元素的时候,将其直接进行返回    if(low==high)        return Math.max(array[low], 0);    //找到数组中间的分界点    int mid=low+(high-low)/2;    //用于寻找到横跨数组左右半边的那个最长子序列    int lMax=0,rMax=0;    int lSum=0,rSum=0;    //找到包含右边界的左半边的最长子序列    for(int i=mid;i>=low;i--)    {        lSum+=array[i];        lMax=Math.max(lSum, lMax);    }           //找到包含左边界的右半边的最长子序列    for(int i=mid+1;i

第三种:时间复杂度为O(N)

 由分析可知,数组的最大连续子序列中的包含最大连续子序列的开头元素或者末尾元素的任意一个子序列里的元素值之和均为正数。为此,可以在仅需遍历一遍数组的过程中,计算出其最大连续子序列和

示例代码如下:

/** * 用于演示O(N)的算法 * @param array 用于寻找最长子序列的数组 * @return 最长子序列的值 */public int maxSubN(int[] array){    int sum=0;    int result=0;    for(int i=0;i
result) result=sum; if(sum<0) sum=0; } return result;}

代码汇总如下:

package other;/** * 该类用于演示寻找最长子序列的几种算法 * @author 学徒 * */public class MaxSubLined{    public static void main(String[] args)    {        int[] array={-2,11,-4,13,-5,2,-5,-3,12,-9};        MaxSubLined max=new MaxSubLined();        System.out.println(max.maxSubN3(array));        System.out.println(max.maxSubN2(array));        System.out.println(max.maxSubNlogN(array));        System.out.println(max.maxSubN(array));    }    /**     * 用于演示O(N^3)的算法     * 算法的思路:     * 穷举数组中以某个元素为起始的,数组中以该元素为起始元素的所有子序列的可能     * 并找出其中子序列和最大的那个值     * @param array 用于寻找最长子序列的数组     * @return 最长子序列的值     */    public int maxSubN3(int[] array)    {        int result=0;        int length=array.length;        //用于控制子序列的起始下标        for(int i=0;i
=low;i--) { lSum+=array[i]; lMax=Math.max(lSum, lMax); } //找到包含左边界的右半边的最长子序列 for(int i=mid+1;i
result) result=sum; if(sum<0) sum=0; } return result; }}

转载于:https://www.cnblogs.com/MyStringIsNotNull/p/8242066.html

你可能感兴趣的文章
SQL2005中时,Diagrams的问题
查看>>
每个分类取最新的几条的SQL实现
查看>>
智慧医疗“验血查癌”或会实现
查看>>
linux中时间精度的获取问题【转】
查看>>
Windows Workflow Foundation学习资源
查看>>
把字符串转化为类型
查看>>
Azure PowerShell (2) 修改Azure订阅名称
查看>>
ss命令使用示例
查看>>
http的请求和响应过程3
查看>>
借用Snippet插件美化博客中的代码
查看>>
Java:文件类File的详解
查看>>
watir学习--baidu搜索示例
查看>>
Hadoop Hive与Hbase关系 整合
查看>>
06.GitHub实战系列~6.过滤器过滤掉的文件如何上传
查看>>
HTML与XML总结
查看>>
ASP.NET 程序安全性 (一) web.config加密与解密
查看>>
计算机中的颜色XII——快速计算纯色的色相值(新的公式)
查看>>
swift:入门知识之枚举和结构体
查看>>
insert/update/delete与undo的关系
查看>>
深度神经网络(DNN)的正则化
查看>>