将一个问题的算法复杂度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;
}