“最大子序列和”算法 java

maxSubSum分别是最大子序列和的4中java算法实现。

第一种算法运行时间为O(N^3),第二种算法运行时间为O(N^2),第三种算法运行时间为O(nlogn),第四种算法运行时间为线性N

public class Test {
	public static void main(String[] args) {
		int[] a = {-2, 11, -4, 13, -5, -2};//最大子序列和为20
		int[] b = {-6, 2, 4, -7, 5, 3, 2, -1, 6, -9, 10, -2};//最大子序列和为16
		System.out.println(maxSubSum4(a));
		System.out.println(maxSubSum4(b));
	}
	//最大子序列求和算法一
	public static int maxSubSum1(int[] a){

		int maxSum = 0;

		//从第i个开始找最大子序列和
		for(int i = 0; i < a.length; i++) {

			//找第i到j的最大子序列和
			for(int j = i; j<a.length; j++) {

				int thisSum = 0;

				//计算从第i个开始,到第j个的和thisSum
				for(int k = i; k<=j; k++){
					thisSum += a[k];
				}
				//如果第i到第j个的和小于thisSum,则将thisSum赋值给maxSum
				if(thisSum>maxSum) {
					maxSum = thisSum;
				}
			}
		}
		return maxSum;
	}

	public static int maxSubSum2(int[] a) {
		int maxSum = 0;
		for(int i = 0; i < a.length; i++) {
			//将sumMax放在for循环外面,避免j的变化引起i到j的和sumMax要用for循环重新计算
			int sumMax = 0;
			for(int j = i; j < a.length; j++) {
				sumMax += a[j];
				if(sumMax>maxSum) {
					maxSum = sumMax;
				}
			}
		}
		return maxSum;
	}

	//递归,分治策略
	//2分logn,for循环n,固O(nlogn)
	public static int maxSubSum3(int[] a) {
		return maxSumRec(a, 0, a.length - 1);
	}
	public static int maxSumRec(int[] a, int left, int right) {
		//递归中的基本情况
		if(left == right) {
			if(a[left] > 0) return a[left];
			else return 0;
		}
		int center = (left + right) / 2;
		//最大子序列在左侧
		int maxLeftSum = maxSumRec(a, left, center);
		//最大子序列在右侧
		int maxRightSum = maxSumRec(a, center+1, right);
		//最大子序列在中间(左边靠近中间的最大子序列+右边靠近中间的最大子序列)
		int maxLeftBorderSum = 0, leftBorderSum = 0;
		for(int i = center; i>=left; i--) {
			leftBorderSum += a[i];
			if(leftBorderSum > maxLeftBorderSum) maxLeftBorderSum = leftBorderSum;
		}
		int maxRightBorderSum = 0, rightBorderSum = 0;
		for(int i = center+1; i<= right; i++) {
			rightBorderSum += a[i];
			if(rightBorderSum > maxRightBorderSum) maxRightBorderSum = rightBorderSum;
		}
		//返回最大子序列在左侧,在右侧,在中间求出的值中的最大的
		return max3(maxLeftSum, maxRightSum, maxLeftBorderSum + maxRightBorderSum);
	}
	public static int max3(int a, int b, int c) {
		return a > b?(a>c?a:c):(b>c?b:c);
	}
	//任何a[i]为负时,均不可能作为最大子序列前缀;任何负的子序列不可能是最有子序列的前缀
	public static int maxSubSum4 (int [] a) {
		int maxSum = 0, thisSum = 0;
		for(int j = 0; j < a.length; j++) {
			thisSum += a[j];
			if(thisSum>maxSum) maxSum = thisSum;
			else if (thisSum < 0) thisSum = 0;
		}
		return maxSum;
	}
}

“最大子序列和”算法 java

时间: 2024-10-10 07:45:45

“最大子序列和”算法 java的相关文章

排序算法Java实现

排序算法Java实现 排序算法的分类: 内部排序,在排序过程中,全部记录放在内存中,称为内部排序: 外部排序,在排序过程中需要使用外部存储(磁盘),则称为外部排序. 主要介绍内部排序: 插入排序:直接插入排序.二分法插入排序.希尔排序 选择排序:简单选择排序.堆排序 交换排序:冒泡排序.快速排序 归并排序 基数排序 插入排序 直接插入排序 基本思想:对于给定的一组记录,初始时假设第一个记录自成一个有序序列,其余记录为无序序列.接着从第二个记录开始,按照记录的大小依次将当前处理的记录插入到其之前的

经典排序算法(Java实现)

以下程序均将数据封装于DataWrap数据包装类中,如下所示: 1 //数据包装类 2 class DataWrap implements Comparable<DataWrap> 3 { 4 int data; 5 String flag; 6 public DataWrap(int data,String flag) 7 { 8 this.data = data; 9 this.flag = flag; 10 } 11 //重写compareTo方法 12 public int compa

银行家算法java实现

关于银行家算法的理论知识,课本或者百度上有好多资料,我就不再多说了,这里把我最近写的银行家算法的实现带码贴出来. 由于这是我们的一个实验,对系统资源数和进程数都指定了,所以这里也将其指定了,其中系统资源数为3,进程数为5. import java.util.Scanner; import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MaximizeAction; import javax.swing.text.StyledEditorKi

无向图的最短路径算法JAVA实现(转)

一,问题描述 给出一个无向图,指定无向图中某个顶点作为源点.求出图中所有顶点到源点的最短路径. 无向图的最短路径其实是源点到该顶点的最少边的数目. 本文假设图的信息保存在文件中,通过读取文件来构造图.文件内容的格式参考这篇文章第一部分. 二,算法实现思路 无向图的最短路径实现相对于带权的有向图最短路径实现要简单得多. 源点的最短路径距离为0,从源点开始,采用广度优先的顺序,首先将与源点邻接的顶点的路径求出,然后再依次求解图中其他顶点的最短路径. 由于顶点的最短路径的求解顺序 是一个 广度优先的顺

算法 《秦九韶算法java实践》

[历史背景] 秦九韶算法是中国南宋时期的数学家秦九韶表述求解一元高次多项式的值的算法--正负开方术.它也可以配合牛顿法用来求解一元高次多项式的根.在西方被称作霍纳算法(Horner algorithm或Horner scheme),是以英国数学家威廉·乔治·霍纳命名的. [原理解释] 设有n+1项的n次函数 f(x)=anxn+ an-1xn-1+an-2xn-2+ an-3xn-3+-- a2x2+a1x+ a0 将前n项提取公因子x,得 f(x)=(anxn-1+ an-1xn-2+an-2

Redis rdb文件CRC64校验算法 Java实现

查看RDB文件结构,发现最后的8字节是CRC64校验算得,从文件头开始直到8字节校验码前的FF结束码(含),经过CRC64校验计算发现,貌似最后的8字节是小端模式实现的. 参考redis的crc64实现的代码,点击查看 Java代码如下: 1 package com.jadic.utils; 2 3 /** 4 * @author Jadic 5 * @created 2014-5-15 6 */ 7 public class CRC64 { 8 private static final lon

MapReduce原理——PageRank算法Java版

Page Rank就是MapReduce的来源,下文是一个简单的计算PageRank的示例. import java.text.DecimalFormat; /**  * Created by jinsong.sun on 2014/7/15.  */ public class PageRankCaculator {     public static void main(String[] args) {         double[][] g = calcG(genS(), 0.85);  

两种常用的全排列算法(java)

问题:给出一个字符串,输出所有可能的排列. 全排列有多种算法,此处仅介绍常用的两种:字典序法和递归法. 1.字典序法: 如何计算字符串的下一个排列了?来考虑"926520"这个字符串,我们从后向前找第一双相邻的递增数字,"20"."52"都是非递增的,"26 "即满足要求,称前一个数字2为替换数,替换数的下标称为替换点,再从后面找一个比替换数大的最小数(这个数必然存在),0.2都不行,5可以,将5和2交换得到"956

最优子序列双射算法(optimal subsequence bijection OSB)

introduction 最近在做关于骨架匹配的东西,在骨架匹配中很重要的一点就是将相同类型的骨架点匹配在一起: 如上图所示,骨架匹配的关键就是将图中 1 2 3 ....      A  B  C  D ...         a  b  c  d ...等这些点按同类型聚合起来,马头对应马头,马尾对应马尾.注意到,在上面一排第一个骨架图中有一个异常点“9”,它与另外两个骨架图中的任意一个节点都不对应. 我们将问题简化一下,将骨架节点简化成实数序列,考虑如下两个序列:a={1 2 3 5}