1. 程式人生 > >最大子陣列和演算法(Java實現)

最大子陣列和演算法(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數量級時,第一種演算法已經沒有實用價值了驚恐


相關推薦

大子陣列演算法Java實現

三種最大子陣列和演算法的Java實現和比較。(1)Java程式碼package com.sau.five.algorithmAnalysis; public class MaxSubsequenceSum { public static int maxSubseque

大子問題java描述

最大子段和問題: 1.問題描述:最大子段和問題就是:給定由n個整數(可能為負數)組成的序列a1,a2,a3......an,求該序列形如ai+ai+1+ai+2+...+aj的子段的最大和。當所有的整數均為負數時,定義其最大子段和為0,。例如,序列(a1,a2,a3,a4,a5,a6)=(-

用鄰接表小堆實現Dijkstra 短路演算法 Java實現

演算法特點: 迪科斯徹演算法使用了廣度優先搜尋解決賦權有向圖或者無向圖的單源最短路徑問題,演算法最終得到一個最短路徑樹。該演算法常用於路由演算法或者作為其他圖演算法的一個子模組。 演算法的思路 Dijkstra演算法採用的是一種貪心的策略,宣告一個數

Eclipse單元測試-大子陣列演算法

1. 在個人電腦中安裝一個整合開發環境(Microsoft Visual Studio、Eclipse或其它工具均可),要求該環境能夠提供單元自動測試功能; 2. 記錄安裝過程,並將全部內容發表在部落

大子問題JAVA

最大子列和 問題描述:給定N個整數的序列{A1,A2,A3,……,An},求解子列和中最大的值。 這裡我們給出{-2,11,-4,13,-5,-2}這樣一個序列,正確的最大子列和為20 該題是在資料結構與演算法中經常用於分析時間複雜度的典型題目,以下將給出

長公共子序列Java實現——動態規劃

【問題描述】 給定2個序列X和Y,當另一序列Z既是X的子序列又是Y的子序列時,稱Z是序列X和Y的公共子序列。 給定2個序列X={A,B,C,B,D}和Y={B,D,C,A,B},找出X和Y的最長公共子序列{B,C,B}。 【分析】最長公共子序列問題具有最優子結構性質 設 X = {

對稱矩陣與壓縮儲存演算法java實現

一、問題描述 實現一個對稱矩陣的壓縮儲存 二、演算法分析 對稱矩陣的特點:a[i][j] = a[j][i].即所有元素關於對角線對稱 所以可以將對稱矩陣的下三角儲存在一個數組物件SA中,儲存方式是, SA[0] = a[0][0] SA[1] = a[1][0]  

實現奇偶數排序演算法JAVA實現

給定一個整數陣列,請調整陣列的順序,使得所有奇數位於陣列前半部分,所有偶數位於陣列後半部分,時間複雜度越小越好。 package com.sort; import java.util.Arrays; public class TestSort { /** * 測試方法 * @par

作業系統- 實驗四 模擬FIFO頁面置換演算法Java實現

                                          &

只含有0,1,2的陣列的排序java實現

要求對只含有0,1,2的陣列進行排序,時間複雜度為O(n),空間複雜度為1 秋招筆試題 /*思路: * 設定三個標記指標:iZero, iOne, iTwo * 令iZero從前往後遍歷,指向第一個

7-1 大子問題 20 分

給定K個整陣列成的序列{ N​1​​, N​2​​, …, N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, …, N​j​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列元素的和中最大者。例如給定序列{ -2, 11,

中國大學MOOC-陳越、何欽銘-資料結構-2018秋 01-複雜度1 大子問題 20 分

01-複雜度1 最大子列和問題 (20 分) 給定K個整陣列成的序列{ N​1​​, N​2​​, ..., N​K​​ },“連續子列”被定義為{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續子列元素的和

作業系統- 實驗二 模擬處理機排程的SJF排程演算法Java實現

                                          &

作業系統-實驗三 模擬處理機HRRN排程演算法Java實現

                                          &

B-Tree的查詢插入java實現

一、java Bean package com.hgldp.web.pojo; import java.util.LinkedList; /** * @author hgl * @data 2018年11月3日 * @description b-tre

01-複雜度1 大子問題20 分

題目描述: 給定K個整陣列成的序列{ N ​1 ​​ , N ​2 ​​ , …, N ​K ​​ },“連續子列”被定義為{ N ​i ​​ , N ​i+1 ​​ , …, N ​j ​​ },其中 1≤i≤j≤K。“最大子列和”則被定義為所有連續

銀行家演算法java實現

package banktext; import java.util.Scanner; public class BankerClass { int[] Available; int[][] Max ; int[][] Alloction ; int[][] Need ; i

從零開始學習演算法Java實現~~~~之字串篇~~~判斷兩個字串是否是顛倒字母順序構成的

從今天開始記錄一下學習演算法的例程,貴在堅持! 寫出一個函式 anagram(s, t) 去判斷兩個字串是否是顛倒字母順序構成的 樣例    給出 s="abcd",t="dcab",返回 true 難都係數* 以下是java程式碼實現: public class So

全排列演算法java實現

100題目之53題目和70題目 在做100題目的時候,全排列的演算法困擾了很久,雖然網上了搜了一些資料,可是並沒有搞懂。今天花了一個下午的時間,從新梳理了一遍,終於弄明白了。 全排列的演算法,遞迴分析網上都有: 設一組數p = {r1, r2, r3, ... ,

java 高效率的排列組合演算法java實現

package BeanUtil; import java.util.ArrayList; import java.util.List; import com.work.core.exception.OurException; /** * 統計任三出現的最