zoukankan      html  css  js  c++  java
  • 时间复杂度完美例子---数组最大子序列和

    package 分而治之;
    
    import utils.Utils;
    
    public class 数组最大子序列和 {
        //time O(n^3) space O(1)
        public static int getMaxSumOfSequence01(int[] a){
            int maxsofar = 0;
            int startIndex = 0,endIndex = 0;
            for(int i=0;i<a.length;i++){
                for(int j=0;j<a.length;j++){
                    int sum = 0;
                    for(int k=i;k<=j;k++)
                        sum+=a[k];
                    if(maxsofar<=sum){
                        startIndex = i;
                        endIndex = j;
                    }
                    maxsofar = Math.max(sum, maxsofar);
                }
            }
            System.out.println("["+startIndex+","+endIndex+"]");
            return maxsofar;
        }
    
        //time O(n^2) space O(1)
        public static int getMaxSumOfSequence02(int[] a){
            int maxsofar = 0;
            int startIndex = 0,endIndex = 0;
            for(int i=0;i<a.length;i++){
                int sum = 0;
                for(int j=i;j<a.length;j++){
                    sum+=a[j];
                    if(maxsofar<=sum){
                        startIndex = i;
                        endIndex = j;
                    }
                    maxsofar = Math.max(sum, maxsofar);
                }
            }
            System.out.println("["+startIndex+","+endIndex+"]");
            return maxsofar;
        }
    
        //time O(n) space O(1)
        public static int getMaxSumOfSequence04(int[] a){
            int maxsofar = 0;
            int sum = 0;
            int startIndex = 0,endIndex = 0;
            for(int i=0;i<a.length;i++){
                sum+=a[i];
                if(sum<=0) {
                    sum = 0;
                    startIndex = i+1;
                } else {
                    if(maxsofar<=sum){
                        endIndex = i;
                    }
                    maxsofar = Math.max(sum, maxsofar);
                }
            }
            System.out.println("["+startIndex+","+endIndex+"]");
            return maxsofar;
        }
    
        //time O(n^2) space O(n)
        public static int getMaxSumOfSequence03(int[] a){
            int maxsofar = 0;
            int startIndex = 0,endIndex = 0;
            int[] currnum = new int[a.length];
            currnum[0] = a[0];
            for(int i=1;i<a.length;i++)
                currnum[i] = currnum[i-1]+a[i];
            for(int i=0;i<a.length;i++){
                int sum = 0;
                for(int j=i;j<a.length;j++){
                    if(i==0) sum = currnum[j];
                    else sum = currnum[j] - currnum[i-1];
                    if(maxsofar<=sum){
                        startIndex = i;
                        endIndex = j;
                    }
                    maxsofar = Math.max(sum, maxsofar);
                }
            }
            System.out.println("["+startIndex+","+endIndex+"]");
            return maxsofar;
        }
    
        //O(log(n))
        public static int getMaxSumOfSequeneceByRecursion(int[] a,int l,int r)
        {
            int lmax,rmax,sum=0;
            int mid = (l+r)/2;
            if(l>r) //zero item
                return 0;
            if(l==r) //only one item
                return Math.max(a[l], 0);
            lmax = sum = 0;
            for(int i=mid;i>=l;i--){
                sum+=a[i];
                lmax = Math.max(lmax, sum);
            }
            rmax = sum = 0;
            for(int i=mid+1;i<=r;i++){
                sum+=a[i];
                rmax = Math.max(rmax, sum);
            }
            return Utils.maxOfThree(lmax+rmax,getMaxSumOfSequeneceByRecursion(a,l,mid),getMaxSumOfSequeneceByRecursion(a,mid+1,r));
        }
    
        public static void main(String[] args) {
            //int a[] = {31,-41,59,26,-53,58,97,-93,-23,84};
            int a[] = Utils.produceNum(-10000, 10000, 10000);
            long t1 = System.nanoTime();
            System.out.println(getMaxSumOfSequence01(a));
            long t2 = System.nanoTime();
            System.out.println("m1 time:"+(t2-t1)/1000);
            System.out.println(getMaxSumOfSequence02(a));
            long t3 = System.nanoTime();
            System.out.println("m2 time:"+(t3-t2)/1000);
            System.out.println(getMaxSumOfSequence03(a));
            long t4 = System.nanoTime();
            System.out.println("m3 time:"+(t4-t3)/1000);
            System.out.println(getMaxSumOfSequence04(a));
            long t5 = System.nanoTime();
            System.out.println("m4 time:"+(t5-t4)/1000);
            System.out.println(getMaxSumOfSequeneceByRecursion(a,0,a.length-1));
            long t6 = System.nanoTime();
            System.out.println("m5递归 time:"+(t6-t5)/1000);
        }
    }
  • 相关阅读:
    2.socket编程
    1网络编程基础概念
    vim笔记
    mysql示例及练习2
    mysql的示例及练习
    自己封装的mysql应用类示例
    mysql3_pymysql
    mysql2
    mysql1
    python之列表与集合
  • 原文地址:https://www.cnblogs.com/czsblog/p/14580537.html
Copyright © 2011-2022 走看看