【問題描述】最大子串行和問題:給定整數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語言比賽的時候,碰到過這個問題。當時就在網上學習了這麼乙個經典演算法。但是到了現在已經有點兒遺忘,今天無意之中又看到了這道題,感覺很親切,而且感覺到這個演算法真的非常經典,所以還是決定收藏在部落格中,希望自己能牢記這個問題。這個演算法用到了動態規劃...