數據結構學習筆記系列1
視頻網址: https://www.bilibili.com/video/av18586085
彙總貼鏈接:https://blog.csdn.net/DX5618258/article/details/104085229
1.3.1 應用實例_算法1&2
案例如下:
算法1:
int MaxSubseqSum1(int A[], int N)
{
int ThisSum, MaxSum = 0;
/*i是子列左端位置*/
for (int i = 0; i < N; i++)
{
/*j是子列右端的位置*/
for (int j = i; j < N; j++)
{
/*ThisSum是從A[i]到A[j]的子列和*/
ThisSum = 0;
for (int k = i; k <= j; k++) ThisSum += A[k];
/*如果剛得到的這個子列和更大,更新最大結果*/
if (ThisSum > MaxSum) MaxSum = ThisSum;
}/*j循環結束*/
}/*i循環結束*/
return MaxSum;
}
時間複雜度 T(N)=O(N^3)
算法2:
int MaxSubseqSum2(int A[],int N)
{
int ThisSum, MaxSum = 0;
/*i是子列左端位置*/
for (int i = 0; i < N; i++)
{
/*ThisSum是從A[i]到A[j]的子列和*/
ThisSum = 0;
/*j是子列右端位置*/
for (int j = i; j < N; j++)
{
/*對於相同的i,不同的j,只要在j-1次循環的基礎上累加1項即可*/
ThisSum += A[j];
/*如果剛得到的這個子列和更大,更新最大結果*/
if (ThisSum > MaxSum) { MaxSum = ThisSum; }
}/*j循環結束*/
}/*i循環結束*/
return MaxSum;
}
時間複雜度 T(N)=O(N^2)
相比算法1而言,算法2只是將算法1的第三層for循環(依次累加各元素)改進成了只加對應的一項,減少將複雜度從O(N^3 )降爲O(N^2) 。
1.3.2 應用實例_算法3
算法3(分而治之->遞歸分組):
算法的複雜度見上圖,但是採用的遞歸算法造成空間複雜度較高。
1.3.3 應用實例_算法4
算法4(在線處理):
int MaxSubseqSum4(int A[], int N)
{
int ThisSum, MaxSum = 0; ThisSum = MaxSum = 0;
/*i是子列左端位置*/
for (int i = 0; i < N; i++)
{
ThisSum += A[i];
/*發現更大的和則更新當前結果*/
if (ThisSum>MaxSum) MaxSum = ThisSum;
/*如果當前子列和爲負,則棄之*/
else if (ThisSum < 0) ThisSum = 0;
}
return MaxSum;
}
時間複雜度 T(N)=O(N)
主要特點是利用else if判斷當前子列和如果小於0,則直接放棄,因爲在子列中添加一個小於0的元素和導致結果一定是比當前的子列和要小的。
運行時間比較(秒)
全部測試代碼如下:
#include <iostream>
#include <time.h>
#include <stdlib.h>
/*宏定義*/
/*定義多項式最大項數*/
#define MAXN 100000
/*定義隨機數的最大值和最小值*/
#define MAXNUM 10
#define MINNUM -10
/*函數聲明*/
int MaxSubseqSum1(int A[], int N);
int MaxSubseqSum2(int A[], int N);
int MaxSubseqSum4(int A[], int N);
int main()
{
/*聲明並初始化係數數組*/
int a[MAXN];
int result = 0;
for (int i = 0; i < MAXN; i++)
{
a[i] = (rand() % (MAXNUM - MINNUM + 1)) + MINNUM;
printf("%d ",a[i]);
}
result = MaxSubseqSum4( a , MAXN );
printf("%d\n",result);
return 0;
}
int MaxSubseqSum1(int A[], int N)
{
int ThisSum, MaxSum = 0;
/*i是子列左端位置*/
for (int i = 0; i < N; i++)
{
/*j是子列右端的位置*/
for (int j = i; j < N; j++)
{
/*ThisSum是從A[i]到A[j]的子列和*/
ThisSum = 0;
for (int k = i; k <= j; k++) ThisSum += A[k];
/*如果剛得到的這個子列和更大,更新最大結果*/
if (ThisSum > MaxSum) MaxSum = ThisSum;
}/*j循環結束*/
}/*i循環結束*/
return MaxSum;
}
int MaxSubseqSum2(int A[],int N)
{
int ThisSum, MaxSum = 0;
/*i是子列左端位置*/
for (int i = 0; i < N; i++)
{
/*ThisSum是從A[i]到A[j]的子列和*/
ThisSum = 0;
/*j是子列右端位置*/
for (int j = i; j < N; j++)
{
/*對於相同的i,不同的j,只要在j-1次循環的基礎上累加1項即可*/
ThisSum += A[j];
/*如果剛得到的這個子列和更大,更新最大結果*/
if (ThisSum > MaxSum) { MaxSum = ThisSum; }
}/*j循環結束*/
}/*i循環結束*/
return MaxSum;
}
int MaxSubseqSum4(int A[], int N)
{
int ThisSum, MaxSum = 0;
ThisSum = MaxSum = 0;
/*i是子列左端位置*/
for (int i = 0; i < N; i++)
{
/*向右累加*/
ThisSum += A[i];
/*發現更大的和則更新當前結果*/
if (ThisSum>MaxSum)
{
MaxSum = ThisSum;
}
/*如果當前子列和爲負,則棄之*/
else if (ThisSum < 0)
{
ThisSum = 0;
}
}
return MaxSum;
}