部分複雜度問題

算法的時間複雜度:

算法的時間複雜度是一個函數,它定量描述了該算法的運行時間。這是一個關於代表算法輸入值的字符串的長度的函數。時間複雜度常用大O表示法,不包括這個函數的低階項和首項係數。使用這種方式時,時間複雜度可被稱爲是漸近的,它考察當輸入值大小趨近無窮時的情況。

下面是部分時間複雜度對比:


算法的空間複雜度:

空間複雜度(SpaceComplexity)是對一個算法在運行過程中臨時佔用存儲空間大小的量度,記做S(n)=O(f(n))。比如直接插入排序時間複雜度是O(n^2),空間複雜度是O(1)。而一般的遞歸算法就要有O(n)的空間複雜度了,因爲每次遞歸都要存儲返回信息。一個算法的優劣主要從算法的執行時間和所需要佔用的存儲空間兩個方面衡量。

分析一個算法所佔用的 存儲空間要從各方面綜合考慮。如對於 遞歸算法來說,一般都比較簡短,算法本身所佔用的 存儲空間較少,但運行時需要一個附加 堆棧,從而佔用較多的臨時工作單元;若寫成非遞歸算法,一般可能比較長,算法本身佔用的存儲空間較多,但運行時將可能需要較少的存儲單元。

我們來看幾個簡單的實例:

(斐波那契數列的非遞歸)

//#include<iostream>
//#include<cassert>
//using namespace std;
//unsigned long long Fib_NonR(long long n)
//{
//	assert(n>=0);
//	if(n==0||n==1)
//		return n;
//	else
//	{
//		long long frist,second;
//		long long ret=0;
//	for(int i=2;i<=n;i++)
//	{
//	frist=i-1;
//	second=i-2;
//	ret=frist+second;
//	frist=second;
//	second=ret;
//	}
//	return ret;
//	}
//}
//int main()
//{
//	int ret=Fib(4);
//	cout<<ret<<endl;
//	system("pause");
//return 0;
//}
//
時間複雜度:O(n)
空間複雜度:O(1)

斐波那契數列的遞歸

#include<iostream>
using namespace std;
long long FibArray(long long n)
{
	if(n==0||n==1)
		return n;
	else 
		return FibArray(n-1)+FibArray(n-2);
}
int main()
{
	cout<<FibArray(100)<<endl;
	system("pause");
	return 0;
時間複雜度:O(2^N)

空間複雜度:O(N)

二分法查找一個數(遞歸):

#include<iostream>
//using namespace std;
//int bin_search(int *arr,int left,int right,int key)
//{
//	while(left<=right)
//	{
//		int equal=(left+right)/2;
//	if(key>equal)
//	{
//	return bin_search(arr,equal+1,right, key);
//	}
//	else if(key<equal)
//	{
//	return bin_search(arr,equal,equal-1,key);
//	}
//	else
//		return arr[equal];
//	}
//	return -1;	
//}
//int main()
//{
//	int arr[]={0,1,2,3,4,5,6,7,8,9,10,11,12};
//	int key=15;
//	int ret=bin_search(arr,0,sizeof(arr)/sizeof(arr[0]),key);
//	cout<<ret<<endl;
//	system("pause");
//	return 0;
//}
時間複雜度:O(log2 N)
空間複雜度:O(N)

因此,遞歸併不一定是最好的,在寫程序之前應該比較不同方法的時間和空間複雜度,再進行選擇。

未完待續!!!!!!!!!!!!

發佈了57 篇原創文章 · 獲贊 74 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章