將一個問題的算法複雜度O(n^3)幹道O(n^2)到O(nlog2n)到O(n)的過程是多麼的feel at easy。
算法的魅力,解決同一大數量級問題的快與慢,明顯體現,請擼碼體驗
測試源碼:https://github.com/linrenyao/Algorithm/blob/master/MaxSumSubList.cpp
//窮舉 O(n^3)
int algorithm1(int list[],int n) {
int MaxSum = 0,TempSum = 0;
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
TempSum = 0;
for (int k = j; k < n; k++) {
TempSum += list[k];
if (TempSum > MaxSum) MaxSum = TempSum;
}
}
}
return MaxSum;
}
//優化後的窮舉,去除不必要的重複累加 O(n^2)
int algorithm2(int list[], int n) {
int MaxSum = 0, TempSum = 0;
for (int i = 0; i < n; i++) {
TempSum = 0;
for (int j = i; j < n; j++) {
TempSum += list[j];
if (TempSum > MaxSum) MaxSum = TempSum;
}
}
return MaxSum;
}
//分治算法(分兒治之,先分後治) 0(nlog2n)
int algorithm3(int *list,int start,int end) {
int mid = (end + start) / 2;
int num = (end - start) / 2;
if (num >= 1) {
int leftMaxSubListSum, RightMaxSubListSum;
//遞歸左半部
leftMaxSubListSum = algorithm3(list, start, mid);
//遞歸右半部
RightMaxSubListSum = algorithm3(list, mid, end);
//求左右兩部分的最大子序列和
int MaxSubListSum = 0, TempSubListSum = 0;
int i = 0;
while (num--) {
TempSubListSum += list[mid-1-i];
if (TempSubListSum > MaxSubListSum) MaxSubListSum = TempSubListSum;
TempSubListSum += list[mid+i];
if (TempSubListSum > MaxSubListSum) MaxSubListSum = TempSubListSum;
i++;
}
//比較三個序列和
int maxSum = max(leftMaxSubListSum, RightMaxSubListSum) > MaxSubListSum ? max(leftMaxSubListSum, RightMaxSubListSum) : MaxSubListSum;
return maxSum;
}
else{
//當序列中只有一個元素則返回,當前序列的唯一和,startindx 和endindx 差1
int MaxSubListSum = 0, TempSubListSum = 0;
for (int i = start; i < end; i++) {
TempSubListSum += list[i];
if (TempSubListSum > MaxSubListSum) MaxSubListSum = TempSubListSum;
}
return MaxSubListSum;
}
}
在線算法:選擇當前相對解。
//在線處理算法 O(n)
int algorithm4(int list[], int n) {
int MaxSum = 0, TempSum = 0;
for (int i = 0; i < n; i++) {
TempSum += list[i];
if (TempSum > MaxSum) MaxSum = TempSum;
else if(TempSum < 0) TempSum = 0;
}
return MaxSum;
}