最大子序列和问题的算法的改进及复杂度分析
最大子序列和的问题
算法1 O(N^3)
(本算法并不计算实际的子序列,实际的计算还要添加一些额外的代码,这里只研究复杂度)
1 public static int maxSubSum1(int[] a){//O(N^3) 2 int maxSum = 0; 3 4 for (int i = 0; i < a.length; i++) { 5 for (int j = 0; j < a.length; j++) { 6 int thisSum = 0;//O(1) 7 8 for (int k = i; k <= j; k++) { 9 thisSum += a[k]; 10 } 11 if (thisSum > maxSum){ //O(N^2) 12 maxSum = thisSum; 13 } 14 15 } 16 } 17 return maxSum; 18 }
我们可以通过撤除一个for循环来避免三次的运行时间
算法二:复杂度O(N^2)
public static int maxSubSum1(int[] a) {//O(N^2) int maxSum = 0; for (int i = 0; i < a.length; i++) { int thisSum = 0;//O(1) for (int j = 0; j < a.length; j++) { thisSum += a[j]; if (thisSum > maxSum) { //O(N) maxSum = thisSum; } } } return maxSum; }
算法1中第8/9行上的计算过分地耗费了。