最大子陣列和演算法(Java實現)
三種最大子陣列和演算法的Java實現和比較。
(1)Java程式碼
package com.sau.five.algorithmAnalysis; public class MaxSubsequenceSum { public static int maxSubsequenceSum01(int[] a) //方法1:時間複雜度n(o^3) { int maxSum=0; //記錄最大子陣列和 for(int i=0;i<a.length;i++) for(int j=i;j<a.length;j++) { int thisSum=0; //臨時記錄 for(int k=i;k<=j;k++) { thisSum+=a[k]; } if(thisSum>maxSum) { maxSum=thisSum; } } return maxSum; } public static int maxSubsequenceSum02(int[] a) //方法2:時間複雜度n(o^2) { int maxSum = 0; for (int i=0; i<a.length;i++) { int thisSum = 0; for (int j =i; jmaxSum ) { maxSum = thisSum; } } } return maxSum; } public static int maxSubsequenceSum03(int[] a) //方法3:時間複雜度n(o) { int maxSum=0; int thisSum=0; for(int i=0;imaxSum) { maxSum = thisSum; } else if(thisSum<0) { thisSum = 0; } } return maxSum; } public static void main(String[] args) //main方法 { int L = 1000; //陣列長度 long startTime00=System.nanoTime(); //獲取程式開始時間 MaxSubsequenceSum mss = new MaxSubsequenceSum(); int[] a = new int[L]; for(int i=0;i<L;i++) { a[i]=(int) (L-(Math.random()*2*L)); //隨機L個-L~L之間的數 } long startTime01=System.nanoTime(); //獲取開始時間 System.out.println(mss.maxSubsequenceSum01(a)); long endTime01=System.nanoTime(); //獲取結束時間 System.out.println("程式01執行時間: "+(endTime01-startTime01)+"ns"); long startTime02=System.nanoTime(); //獲取開始時間 System.out.println(mss.maxSubsequenceSum02(a)); long endTime02=System.nanoTime(); //獲取結束時間 System.out.println("程式02執行時間: "+(endTime02-startTime02)+"ns"); long startTime03=System.nanoTime(); //獲取開始時間 System.out.println(mss.maxSubsequenceSum03(a)); long endTime03=System.nanoTime(); //獲取結束時間 System.out.println("程式03執行時間: "+(endTime03-startTime03)+"ns"); long endTime00=System.nanoTime(); //獲取程式結束時間 System.out.println("程式總執行時間: "+(endTime00-startTime00)+"ns"); } }
(2)三種演算法執行結果比較
① 陣列長度為1000時,執行結果如下圖。比較三種演算法的執行時間(單位:豪秒)約為 96.23:2.86:0.07,可見第三種演算法的執行效率遠高於前兩種演算法。② 陣列長度為10000時,執行結果如下圖。比較三種演算法的執行時間(單位:秒)約為 98.85:0.03:0.0003,而程式總執行時間也不過98.88秒,可見第一種演算法幾乎佔用了程式執行的全部時間。③ 陣列長度為100000時,執行結果如下圖。調換一下程式的執行順序,比較三種演算法的執行時間(單位:秒)約為 ∞:2.16:0.003,可見當陣列長度達到10^6數量級時,第一種演算法已經沒有實用價值了。