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);
    	}
    }

  • 相关阅读:
    Http错误代码
    Android View自动生成插件
    【Android】设备标识
    【Android】键盘的展开和收起
    【Android】Activity生命周期(亲测)
    【Android】IntentService & HandlerThread源码解析
    【Android】与服务器实现JSON数据通信
    【Web】Eclipse + Maven + Struts搭建服务器
    【Android】Kill Service
    【Android】Handler、Looper源码分析
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5139538.html
Copyright © 2011-2022 走看看