求最大子串行和(Java實現)

2021-06-08 02:24:14 字數 2842 閱讀 7537

【問題描述】最大子串行和問題:給定整數a1, a2, ..., an(可能有負數),σak的最大值(為方便起見,如果所有整數均為負數,則最大子串行和為0)。

通過四種方式來完成演算法的實現,時間複雜度分別為:o(n*n*n)、o(n*n)、o(n*log n)、o(n)

【原始碼1】

package cn.edu.nwsuaf.cie.qhs.maxsubsum;

/** * 求最大子串行和(1)

* @author 靜寞小森(滄海森林)

* 下面的這種做法來求和,應該是程式設計師最直觀想到的,時間複雜度為:o(n*n*n)

* */

public class maxsubsum1 }}

} return maxsum; }

/*** @param args

*/public static void main(string args) ;

long starttime = system.nanotime();

system.out.println("最大子串行和為:"+maxsubsum1.maxsum(array));

long endtime = system.nanotime();

system.out.println("程式耗時為:"+(endtime-starttime)+" ns");

}}

【原始碼2】

package cn.edu.nwsuaf.cie.qhs.maxsubsum;

/** * 求最大子串行和(2)

* * @author 靜寞小森(滄海森林)

* 第二種做法,是對做法(1)進行一下分析,可以得知,程式中第三層迴圈不是必須的,因為這個過程可以包含在第二層迴圈中,所以可以考慮去掉。

* 去掉乙個for迴圈,可以得到迴圈的次數減少了n的倍數,所以時間複雜度為o(n*n)

* */

public class maxsubsum2

}} return maxsum;

} /**

* @param args

*/public static void main(string args) ;

long starttime = system.nanotime();

system.out.println("最大子串行和為:"+maxsubsum2.maxsum(array));

long endtime = system.nanotime();

system.out.println("程式耗時為:"+(endtime-starttime)+" ns");

}}

【原始碼3】

package cn.edu.nwsuaf.cie.qhs.maxsubsum;

/** * 求最大子串行和(3)

* * @author 靜寞小森(滄海森林)

* 第三種方法,我們將採用「分而治之」的想法,進行編碼。因為本程式,最大子串行和只能出現在三個位置上:

* 左半部分、右半部分、跨著左右兩半部分;所以我們可以採用二分的「分而治之」來進行分開解決問題。可知其時間複雜度為:o(n*log n)

*/public class maxsubsum3

private static int maxsumrec(int array,int left,int right)

int maxrightbordersum = 0, currightbordersum = 0;

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

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

public static int maxsum(int array)

/*** @param args

*/public static void main(string args) ;

long starttime = system.nanotime();

system.out.println("最大子串行和為:"+maxsubsum3.maxsum(array));

long endtime = system.nanotime();

system.out.println("程式耗時為:"+(endtime-starttime)+" ns"); }

}

【原始碼4】

package cn.edu.nwsuaf.cie.qhs.maxsubsum;

/** * 求最大子串行和(4)

* * @author 靜寞小森(滄海森林)

* 第四種方法,是通過乙個「聯機演算法」進行的最優演算法計算,時間複雜度僅為o(n)

* */

public class maxsubsum4 else if(cursum < 0)

} return maxsum;

} /**

* @param args

*/public static void main(string args) ;

long starttime = system.nanotime();

system.out.println("最大子串行和為:"+maxsubsum3.maxsum(array));

long endtime = system.nanotime();

system.out.println("程式耗時為:"+(endtime-starttime)+" ns");

}}

求最大子串行和

include using namespace std int maxseqsum const int a,int n o n 2 return s2 int maxseqsum2 const int a,int n o n else if s1 0 return s2 int maxseqsum3...

求最大子串行

1.暴力求解,時間複雜度為n 3 int maxsubarray int a int n return maxsum 2.分治法 將陣列從中間分開,那麼最大子陣列要麼完全再左半邊陣列,要麼完全在右半邊陣列,要麼跨立在分界點上。完全在左陣列 右陣列遞迴解決。跨立在分界點上 實際上是左陣列的最大字尾和右...

求最大子串行和演算法

這是個比較經典的c語言演算法問題。記得,在大二參加c語言比賽的時候,碰到過這個問題。當時就在網上學習了這麼乙個經典演算法。但是到了現在已經有點兒遺忘,今天無意之中又看到了這道題,感覺很親切,而且感覺到這個演算法真的非常經典,所以還是決定收藏在部落格中,希望自己能牢記這個問題。這個演算法用到了動態規劃...