最大子串行和問題的求解

2021-09-27 10:49:16 字數 1914 閱讀 2008

怎麼求出乙個陣列最大的連續累加之和呢?方法有很多,我們目前只講乙個比較不錯的方法,該方法使用了分治遞迴的思想。

我們假設下面是我們需要計算的陣列,其中a是游標,我可以知道游標將陣列分成了兩段,最大值有可能出現在前半段也有可能出現在後半段,還有一種情況是跨越a(中間)相加的一段。

[1,-3,5,7 a,9,-8,6,2]

跨越a相加的部分我們可以這樣計算:

int maxleftbordersum =0;

int leftbordersum =0;

for (int i = center;i >= left;i--)

}int maxrightbordersum =0;

int rightboedersum =0;

for (int i = center +1;i <= right;i++)

}

以中間為起點向兩邊相加,然後將左右兩邊最大和相加:maxleftbordersum+maxrightbordersum,即可得跨越a相加最大的。

前後端最大值可以通過遞迴求得:

int center = (left + right)/2;

int maxleftsum =maxsumrec(array,left,center);

int maxrightsum =maxsumrec(array,center+1,right);

最後我們分析一下這個遞迴方法的基準方法:

if (left == right)else 

}

因此完整的程式是:

public static void main(string args)throws exception ;

system.out.println("結果:"+maxsumrec(array,0,array.length-1));

}public static int maxsumrec(int array,int left,int right)else

}int center = (left + right)/2;

int maxleftsum =maxsumrec(array,left,center);

int maxrightsum =maxsumrec(array,center+1,right);

int maxleftbordersum =0;

int leftbordersum =0;

for (int i = center;i >= left;i--)

}int maxrightbordersum =0;

int rightboedersum =0;

for (int i = center +1;i <= right;i++)

}return max(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);

}public static int max(int v1,int v2,int v3)else

}

最後返回三者的最大值即可求得。

這種演算法算是效率比較高的,但是根據合成效益法則可知,這個演算法仍然有重複計算的部分。

下面說的這種算是則不會出現這種情況,只會對陣列進行一次掃瞄。

public static void main(string args) throws exception ;

system.out.println("結果:"+maxsubsum(array));

}public static int maxsubsum(int array) else if (thissum<0)

}return maxsum;

}

這種演算法是僅需要常量空間並以線性時間執行的聯機演算法。

最大子串行和問題求解

基本思想 窮舉式的嘗試所有可能,通過三層迴圈計算所有子串行的和。演算法步驟 1.第一層迴圈從0到n 1,確定子串行的開始位置 2.第二層迴圈從第一層迴圈變數開始到n 1,確定子串行的結束位置 3.第三層迴圈從第一層迴圈變數開始到第二層迴圈變數結束,計算這個子串行的和,並與最大子串行和比較,如果大於最...

求解最大子串行和問題

原題 給定乙個陣列,其中元素有正,也有負,找出其中乙個連續子串行,使和最大 不想說明什麼,我們資料結構老師第一節課就給我們講這個,以前給實現過乙個暴力演算法版的演算法複雜度 o n2 現在實現乙個動態規劃版的 求解最大子串行和問題o n 演算法 param array public static v...

最大子串行和問題的求解

問題描述 給定 可能存在負值 整數a1,a 2.a n,求最大子串行和。如果所有的整數均為負數,則最大子串行和為0.列如 對於輸入 2,11,4,13,5,2,該輸入的最大子串行和為20 11 4 13 現在我們將敘述四個演算法來求解最大子串行和問題。1.該演算法是使用窮舉法來嘗試所有的可能 演算法...