時間複雜度和最大子串行問題

2021-07-10 05:45:10 字數 1597 閱讀 5539

執行時間計算

法則1——for迴圈

乙個for迴圈的執行時間最多是該for迴圈內部那些語句(包括測試)的執行時間乘以迭代的次數。

法則2——巢狀的for迴圈

從裡向外分析這些迴圈,在一組巢狀迴圈內部的一條語句的執行時間為該語句的執行時間乘以該組所有的for迴圈的大小的乘積。

法則3——順序語句

將各個語句的執行時間求和即可。

法則4——if/else語句

乙個if/else語句的執行時間不會超過判斷的執行時間再加上s1和s2中執行時間長者的總的執行時間。

下面通過四種演算法來比較最大子串行問題的時間複雜度

package algorithm;

public class test1

if (num > max)

}} return max;

} //方法二 省略一層迴圈

public static int getmaxnum2(int a)

}} return max;

} //方法三 分治法利用遞迴

public static int getmaxnum3(int a, int left, int right)

int center = (left + right) / 2;

int maxleft = getmaxnum3(a, left, center);

int maxright = getmaxnum3(a, center + 1, right);

int leftmax = 0, leftnum = 0;

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

} int rightmax = 0, rightnum = 0;

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

} return getmax(maxleft, maxright, leftmax + rightmax);

} //方法四 非常聰明簡單的方法

public static int getmaxnum4(int a)else if(num <0)

} return max;

} public static int getmax(int maxleft, int maxright, int num) else }

public static void main(string args) ;

system.out.println(getmaxnum3(a,0,a.length-1));

system.out.println(getmaxnum1(a));

system.out.println(getmaxnum2(a));

system.out.println(getmaxnum4(a)); }}

第一種方法採用窮舉法,將每一種情況列舉出來一一比較,演算法複雜度較高達到o(n3)

第三種方法採用分治法的思想,其思想就是把問題分成兩個大致相等的子問題,然後遞迴地對它們求解。最後將兩個子問題修補到一起並可能做些少量的附加工作,最後得到整個問題的解。

第四種方法效果最高,為o(n)

時間複雜度 最大子列和問題

給定kk k個整數組成的序列,連續子列 被定義為n i 1 njn jn j 其中 1 i j k1 le i le j le k1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各...

最大子段和問題(分治)時間複雜度O N

succ i 儲存以 i 結尾的最大區間和左端點的下標 pred i 儲存以 i 開頭的最大區間和右端點的下標 include include include include define x first define y second using namespace std typedef pai...

最大子串行和O(n)階複雜度演算法

問題描述給定整數序列a1,a2,a3,a4,a5,求 ai a i 1 aj 的最大值 int mostson int arryin,int len else return most 演算法解釋 確定子串行最大值得關鍵點在於確定序列開始位置和結束位置。開始位置難以確定,確定開始位置之後每加乙個數字的...