時間複雜度太大,該算法不可取。
該時間複雜度爲O(N),一般遇到爲次複雜度的可以考慮改進算法,使其複雜度爲O(logN),將會有大的改善。
- #include <stdio.h>
- #include <time.h>
- //算法1
- int MaxSubseqSum1(int A[], int N, int * s, int* e)
- {
- int ThisSum, MaxSum = 0;
- int i, j, k;
- for (i = 0; i < N; i++) /* i是子列左端位置 */
- {
- for (j = i; j < N; j++) /* j是子列右端位置 */
- {
- ThisSum = 0; /* ThisSum是從A[i]到A[j]的子列和 */
- for (k = i; k <= j; k++)
- {
- ThisSum += A[k];
- }
- if (ThisSum > MaxSum) /* 如果剛得到的這個子列和更大 */
- {
- MaxSum = ThisSum; /* 則更新結果 */
- *e = j;
- *s = i;
- }
- } /* j循環結束 */
- } /* i循環結束 */
- return MaxSum;
- }
- //算法2
- int MaxSubseqSum2(int A[], int N,int * s, int* e)
- {
- int ThisSum, MaxSum = 0;
- int i, j;
- *s = 0;
- *e = N;
- for (i = 0; i < N; i++) /* i是子列左端位置 */
- {
- ThisSum = 0; /* ThisSum是從A[i]到A[j]的子列和 */
- for (j = i; j < N; j++) /* j是子列右端位置 */
- {
- ThisSum += A[j]; /*對於相同的i,不同的j,只要在j-1次循環的基礎上累加1項即可*/
- if (ThisSum > MaxSum) /* 如果剛得到的這個子列和更大 */
- {
- MaxSum = ThisSum; /* 則更新結果 */
- *e = j;
- *s = i;
- }
- } /* j循環結束 */
- } /* i循環結束 */
- return MaxSum;
- }
- //算法3
- int MaxSubseqSum3(int A[], int left, int right, int *s, int *e)
- {
- int i = 0, j = 0, sum = 0;
- int s1 = 0, s2 = 0, lefts = 0, rights = 0;
- int center, leftsum, rightsum;
- if (left == right)
- {
- if (A[left]>0)
- sum = A[left];
- else
- sum = 0;
- *s = left; *e = right;
- }
- else
- {
- center = (left + right) / 2; //劃分
- leftsum = MaxSubseqSum3(A, left, center, s, e); //對應情況1,遞歸求解
- rightsum = MaxSubseqSum3(A, center + 1, right, s, e); //對應情況2,遞歸求解
- //求解s1
- for (i = center; i >= left; i--)
- {
- lefts +=A[i];
- if (lefts > s1)
- {
- *s = i;
- *e = center/2*2; //不清楚爲啥是這樣的
- s1 = lefts;
- }
- }
- //再求解s2
- for (j = center + 1; j <= right; j++)
- {
- rights = rights + A[j];
- if (rights > s2)
- {
- s2 = rights;
- *e = j;
- *s = (center+1)/2*2; //依然不清楚
- }
- }
- sum = s1 + s2; //計算情況3的最大子段和
- if (sum<leftsum)
- sum = leftsum;
- if (sum<rightsum)
- sum = rightsum;
- }
- return sum;
- }
- int MaxSubseqSum4(int A[], int N, int * s, int* e)
- {
- int ThisSum, MaxSum;
- int i;
- int ss = 0;
- ThisSum = MaxSum = 0;
- for (i = 0; i < N; i++)
- {
- ThisSum += A[i]; /* 向右累加 */
- if (ThisSum > MaxSum)
- {
- MaxSum = ThisSum; /* 發現更大和則更新當前結果 */
- *s = ss;
- *e = i;
- }
- else if (ThisSum < 0) /* 如果當前子列和爲負 */
- {
- ThisSum = 0; /* 則不可能使後面的部分和增大,拋棄之 */
- ss = i+1;
- }
- }
- return MaxSum;
- }
- int main() {
- int a[] = { -10 ,1, 2, 3, 4, - 5, - 23, 3, 7, - 21 };
- int result,s,e,i;
- clock_t start, ended;
- double duration;
- const int COUNT = 100000;
- start = clock();
- for ( i = 0; i< COUNT; i++)
- result = MaxSubseqSum1(a, sizeof(a) / sizeof(a[0]), &s, &e);
- ended = clock();
- duration = (double)(ended - start) / CLK_TCK;
- printf("ticks1 = %lf\n",(double)(ended - start));
- printf("duration1 = %lf\n", duration);
- printf("start1=%d,ended1=%d result1 = %d\n", s,e,result);
- start = clock();
- for ( i = 0; i< COUNT; i++)
- result = MaxSubseqSum2(a, sizeof(a) / sizeof(a[0]), &s, &e);
- ended = clock();
- duration = (double)(ended - start) / CLK_TCK;
- printf("ticks2 = %lf\n", (double)(ended - start));
- printf("duration2 = %lf\n", duration);
- printf("start2=%d,ended2=%d result2 = %d\n", s, e, result);
- start = clock();
- for ( i = 0; i< COUNT; i++)
- result = MaxSubseqSum3(a, 0, sizeof(a) / sizeof(a[0]), &s, &e);
- ended = clock();
- duration = (double)(ended - start) / CLK_TCK;
- printf("ticks3 = %lf\n", (double)(ended - start));
- printf("duration3 = %lf\n", duration);
- printf("start3=%d,ended3=%d result3 = %d\n", s, e, result);
- start = clock();
- for ( i = 0; i< COUNT; i++)
- result = MaxSubseqSum4(a, sizeof(a) / sizeof(a[0]), &s, &e);
- ended = clock();
- duration = (double)(ended - start) / CLK_TCK;
- printf("ticks4 = %lf\n", (double)(ended - start));
- printf("duration4 = %lf\n", duration);
- printf("start4=%d,ended4=%d result4 = %d\n", s, e, result);
- return 0;
- }