zoukankan      html  css  js  c++  java
  • 求最大子段和的一些算法

    public class MaxSubSeqSum {
    	/**
    	 * 算法1,穷举搜索
    	 */
    	public static final int maxSubSeqSum1(int seq[]) {
    		int length = seq.length;
    		int sum = 0;
    		for (int i = 0; i < length; i++) {
    			for (int j = i; j < length; j++) {
    				int theSum = 0;
    				for (int k = i; k <= j; k++) {
    					theSum += seq[k];
    				}
    				if (sum < theSum) sum = theSum;
    			}
    		}
    		return sum;
    	}
    	
    	/**
    	 * 算法2。改进算法1
    	 */
    	public static final int maxSubSeqSum2(int seq[]) {
    		int length = seq.length;
    		int sum = 0;
    		for (int i = 0; i < length; i++) {
    			int theSum = 0;
    			for (int j = i; j < length; j++) {
    				theSum += seq[j];
    				if (theSum > sum) {
    					sum = theSum;
    				}
    			}
    		}
    		return sum;
    	}
    	
    	/**
    	 * 算法3:分治法
    	 */
    	public static final int maxSubSeqSum3(int seq[]) {
    		return maxSubSeqSum31(seq, 0, seq.length - 1);
    	}
    	
    	private static int max(int... args) {
    		int max = Integer.MIN_VALUE;
    		for (int i : args) {
    			if (i > max) max = i;
    		}
    		return max;
    	}
    	
    	private static final int maxSubSeqSum31(int[] seq, int left, int right) {
    		if (right - left == 1) { // 仅仅剩下两个了:
    			return max(seq[left], seq[right], seq[left] + seq[right], 0);
    		} else if (left == right) {
    			return max(seq[left], 0);
    		} else {
    			int middle = (left + right) / 2;
    			int maxLeft = maxSubSeqSum31(seq, left, middle);
    			int maxRight = maxSubSeqSum31(seq, middle + 1, right);
    			int maxMiddle = maxSubSeqMiddle(seq, left, right, middle);
    			return max(maxLeft, maxRight, maxMiddle);
    		}
    	}
    	
    	private static final int maxSubSeqMiddle(int[] seq, int left, int right, int middle) {
    		int maxLeft = 0, maxRight = 0;
    		int temp = 0;
    		for (int i = middle; i >= left; i--) {
    			temp += seq[i];
    			if (maxLeft < temp) {
    				maxLeft = temp;
    			}
    		}
    		temp = 0;
    		for (int i = middle + 1; i <= right; i++) {
    			temp += seq[i];
    			if (maxRight < temp) {
    				maxRight = temp;
    			}
    		}
    		return max(maxLeft, maxRight, maxLeft + maxRight);
    	}
    	
    	/**
    	 * 最快的计算方式
    	 * @param seq
    	 * @return
    	 */
    	public static final int maxSubSeqSum4(int seq[]) {
    		int sum = 0, theSum = 0;
    		int length = seq.length;
    		for (int i = 0; i < length; i++) {
    			theSum = max(theSum + seq[i], 0);
    			if (sum < theSum) {
    				sum = theSum;
    			}
    		}
    		return sum;
    	}
    	
    	public static void main(String[] args) throws Exception {
    		int length = 100000;
    		int[] arr = new int[length];
    		Random rand = new Random(10);
    		for (int i = 0; i < length; i++) {
    			arr[i] = rand.nextInt(11) - 5;
    		}
    		long t = System.currentTimeMillis();
    //		int ret1 = maxSubSeqSum1(arr);
    //		System.out.println("算法1耗时:" + (System.currentTimeMillis() - t));
    //		System.out.println("结果1:" + ret1);
    //		
    		t = System.currentTimeMillis();
    		int ret2 = maxSubSeqSum2(arr);
    		System.out.println("算法2耗时:" + (System.currentTimeMillis() - t));
    		System.out.println("结果2:" + ret2);
    		
    		t = System.currentTimeMillis();
    		int ret3 = maxSubSeqSum3(arr);
    		System.out.println("算法3耗时:" + (System.currentTimeMillis() - t));
    		System.out.println("结果3:" + ret3);
    		
    		t = System.currentTimeMillis();
    		int ret4 = maxSubSeqSum4(arr);
    		System.out.println("算法4耗时:" + (System.currentTimeMillis() - t));
    		System.out.println("结果4:" + ret4);
    	}
    }

  • 相关阅读:
    git常用指令 github版本回退 reset
    三门问题 概率论
    如何高效的学习高等数学
    数据库6 关系代数(relational algebra) 函数依赖(functional dependency)
    数据库5 索引 动态哈希(Dynamic Hashing)
    数据库4 3层结构(Three Level Architecture) DBA DML DDL DCL DQL
    梦想开始的地方
    java String字符串转对象实体类
    java 生成图片验证码
    java 对象之间相同属性进行赋值
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5139538.html
Copyright © 2011-2022 走看看