最大子串行和整理,複雜度從O n 3 到O n

2021-06-29 06:31:42 字數 2287 閱讀 3254

求乙個序列的子串行的最大值,這是乙個經典演算法,這裡稍作整理。

問題:任給乙個整數序列,如,求出這個序列中連續子串行的和的最大值,這個例子中最大值為32,子串行為。

方法一:最簡單的暴力法。確立乙個起點,乙個終點,計算起點到終點的和。下面**中int brute_force(int* a,int n)實現了該演算法,時間複雜度由

方法二:對暴力法的優化,使用累加的方法,確定乙個起點之後,將前面序列的和累加到終點,選取乙個最大值。下面**中int improved_brute_force(int* a, int n),實現了該演算法。時間複雜度由

方法三:採用分治法的思想,從中間點將序列分成兩個子串行,整個序列的最大子串行位置分三種情況(見圖,此圖來自老師ppt)

1.在左側子串行中

2.在右側子串行中

3.包含中間點,兩個序列各有一部分。

下面的int divide_conquer(int* a,int start,int end)方法實現了該演算法,該遞迴實現的遞迴式為t(n)=2t(n/2)+cn。由master theorem可得時間複雜度為o(nlogn).

方法四

#include #include #include #define len_array 12

/*求最大子串行的和

*///brute force:時間複雜度n^3

int brute_force(int* a,int n)

} } return max_value;

}//提高的brute force, 時間複雜度n^2

int improved_brute_force(int* a, int n)

} }return max_value;

}//分治法,時間複雜度nlog(n)

//從中間點將序列分成兩個子串行,整個序列的最大子串行位置分三種情況

//1.在左側子串行中

//2.在右側子串行中

//3.包含中間點,兩個序列各有一部分

int divide_conquer(int* a,int start,int end) }

for(i=mid;i<=end;i++)

} mid_max = mid_to_left_max+mid_to_right_max-a[mid];

side_max = left_max>right_max?left_max:right_max;

max = side_max>mid_max?side_max:mid_max;

return max;

}//不需要所有的資料都準備好,而是對逐步輸入的資料進行處理,並在輸入完成之後輸出運算結果。與之相對的是

//用動態規劃處理最大子串行長度的思想為用變數max_value儲存最大子串行的和,用current_value儲存從i=0累加的

//的和,如果current_value大於max_value則儲存,否則放棄,如果current減小到零,則將current_value從0重新開始計

//因為再講current_value累加的話只會減少子串行的和

int dynamic_prom(int* a,int len)

if(current_value<0)

} return max_value;

}int main();

printf("brute force: %d\n",brute_force(a,len_array));

printf("improved brute force: %d\n",improved_brute_force(a,len_array));

printf("divide conquer: %d\n",divide_conquer(a,0,len_array-1));

printf("dynamic programming: %d\n",dynamic_prom(a,len_array));

printf("\n");

return exit_success;

}

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

執行時間計算 法則1 for迴圈 乙個for迴圈的執行時間最多是該for迴圈內部那些語句 包括測試 的執行時間乘以迭代的次數。法則2 巢狀的for迴圈 從裡向外分析這些迴圈,在一組巢狀迴圈內部的一條語句的執行時間為該語句的執行時間乘以該組所有的for迴圈的大小的乘積。法則3 順序語句 將各個語句的執...

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

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

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

題目 輸入一組整數,求出這組數字子串行和中的最大值,只要求出最大子串行的和,不必求出最大值對應的序列。最大子串行和 整數序列a1,a2,an 可能有負數 求a1 an的乙個子串行ai aj,使得ai到aj的和最大。例如 序列 2,11,4,13,5,2,5,3,12,9,則最大子串行和為21。序列 ...