數據結構學習筆記系列3——算法案例分析

數據結構學習筆記系列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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章