通常我們衡量乙個演算法的複雜度時,會有兩種演算法效率分析方式:第一種是時間效率,第二種是空間效率。
時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。 時間複雜度主要衡量的是乙個演算法的執行速度,
空間複雜度主要衡量一乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很是在乎。但是經過計算機行業的迅速發展,計算機的儲存容量已經達到了很高的程度。所以我們如今已經不需要再特別關注乙個演算法的空間複雜度
時間複雜度的定義:在電腦科學中,演算法的時間複雜度是乙個函式,它定量描述了該演算法的執行時間。乙個演算法執行所耗費的時間,從理論上說,是不能算出來的,只有你把你的程式放在機器上跑起來,才能知道。但是我們需要每個演算法都上機測試嗎?是可以都上機測試,但是這很麻煩,所以才有了時間複雜度這個分析方式。乙個演算法所花費的時間與其中語句的執行次數成正比例,演算法中的基本操作的執行次數,為演算法的時間複雜度。
一般來說,乙個演算法執行所消耗的時間從理論上是算不出來的,只有通過上機執行才能測試出來。當然,我們也沒必要知道乙個演算法它具體執行的時間是多少,而我們又知道,乙個演算法花費的時間與演算法中語句的執行次數是成正比的。哪個演算法語句執行的次數多,它花費的時間就多這就引入了我們通常使用的:大o漸進表示法
實際中我們計算時間複雜度時,我們其實並不一定要計算精確的執行次數,而只需要大概執行次數,那麼這裡就要使用大0的漸進表示法。
大0符號(big 0 notation) :是用於描述函式漸進行為的數學符號。
1、用常數1取代執行時間中的所有加法常數。
2、在修改後的執行次數函式中,只保留最高端項。
3、如果最高端項存在且不是1,則去除與這個專案相乘的常數。得到的結果就是大0階。
使用大0的漸進表示法以後,func1 的時間複雜度為:
o(v2)
n=10 f(n)= 100n= 100 f(n) = 10000
n=1000 f(n)= 1000000
通過上面我們會發現大0的漸進表示法去掉了那些對結果影響不大的項,簡潔明瞭的表示出了執行次數。
最壞情況:任意輸入規模的最大執行次數(上界)
平均情況:任意輸入規模的期望執行次數
最好情況:任意輸入規模的最小執行次數(下界)
在乙個長度為n陣列中搜尋乙個資料x
最好情況: 1次找到
最壞情況: n次找到
平均情況: n/2次找到
在實際中-一般情況關注的是演算法的最壞運**況,所以陣列中搜尋資料時間複雜度為o(n)
void test(int n)
int m = 1000;
while (m--)
printf("%d\n", count);
}
該**基本操作執行了2*n+1000,通過推導大0階方法知道,它的時間複雜度為:o(n)
void test1(int m, int n)
for (k = 0; k < n; k++)
printf("%d\n", count);
}
例項2中操作執行了m + n次,因為有兩個未知數m和n,所以時間複雜度為o(m+n)
void test2( int n)
printf("%d\n", count);
}
例項3操作執行了1000次,通過推導大0階方法,時間複雜度為o(1)
const char* strstr(const char* str, int character);
例項4操作執行時,最好1次,最壞n次,時間複雜度一般看最壞,時間複雜度為o(n)
void bubblesort(int* a, int n)
}if (exchange == 0)
}}
例項5操作最好執行n次,最壞執行(n*(n+1)/2次,通過推導大0階方法,時間複雜度一般看最壞,時間複雜度為o(n^2)
int binarysearch(int* a, int n, int x)
else if (a[mid]>x)
else
}return -1;
}
例項6操作最好執行1次,最壞執行(logn)次,通過推導大0階方法,時間複雜度一般看最壞,時間複雜度為o(logn)
long long factorial(size_t n)
例項7操作通過計算遞迴了n次,時間複雜度為o(n)
long long factorial(size_t n)
例項8操作通過計算遞迴了2^n次,時間複雜度為o(2^n)
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。空間複雜度不是程式占用了多少bytes的空間,因為這個也沒太大意義,所以空間複雜度算的是變數的個數。空間複雜度計算規則基本跟實踐複雜度類似,也使用大0漸進表示法。
void bubblesort(int* a, int n)
}if (exchange == 0)
}}
例項1使用了常數個額外空間,所以空間複雜度為0(1)
long long* fibonacci(size_t n)
return fibarray;
}
例項2動態開闢了n個空間,空間複雜度為o(n)
long long factorial(size_t n)
例項3遞迴呼叫了n次,開闢了n個棧幀,每個棧幀使用了常數個空間。空間複雜度為o(n)
資料結構 時間複雜度 空間複雜度
1.演算法效率 演算法效率可以用來衡量乙個演算法的好壞 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率.時間效率被稱為時間複雜度,空間效率被稱為空間複雜度.時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小...
資料結構時間複雜度和空間複雜度
1 演算法o n 關注n的階數,當數十分大的時候,常數可以忽略。o n 又稱為大o記法。2 t n o f n 隨著n變化而變化,f n 是某個函式,執行的次數等於時間,一般情況下,t n 增長最慢的演算法最優。4 推到o n 1,用1取代時間中所有加法常數 哪些可以忽略 2,在修改後的執行函式中,...
資料結構 時間複雜度和空間複雜度
演算法 algorithm 是對特定問題求解步驟的一種描述。解決乙個問題往往有不止一種方法,演算法也是如此。那麼解決特定問題的多個演算法之間如何衡量它們的優劣呢?有如下的指標 1 時間複雜度 執行這個演算法需要消耗多少時間。2 空間複雜度 這個演算法需要占用多少記憶體空間。同乙個問題可以用不同的演算...