目錄
1. 漸進記號Θ、Ο、o、Ω、ω的定義及其使用
1)漸近緊確界記號:Ɵ(big-theta):
由下圖中左側f(n)=Θ(g(n))圖可以看出,對所有n>n0時,函數f(n)乘一個常量因子可等於g(n),我們稱g(n)是f(n)的一個漸近緊確界 。Θ記號在五個記號中,要求是最嚴格的,因爲g(n)即可以表示上界也可以表示下界。
需要注意的是:Θ(g(n))的定義要求每個成員f(n)∈Θ(g(n))均漸近非負,即當n足夠大時,f(n)非負。漸近正函數就是對所有足夠大的n均爲正的函數。
2)漸近上界記號:O(big-oh)
定義:設f(n)和g(n)是定義域爲自然數集N上的函數。若存在正數c和n0,使得對一切n≥n0都有0≤f(n)≤cg(n)成立,則稱f(n)的漸進的上界是g(n),記作f(n)=O(g(n))。通俗的說n滿足一定條件範圍內,函數f(n)的階不高於函數g(n)。
根據符號O的定義,用它評估算法的複雜度得到的只是問題規模充分大時的一個上界。這個上界的階越低,評估越精確,越有價值。
幾種常見的複雜度關係
O(1)<O(log(n))<O(n)<O(nlogn)<<<O(n!)<
需要注意的是:對數函數在沒有底數時,默認底數爲2;如lgn=logn=log2n 因爲計算機中很多程序是用二分法實現的。
符號用法測試:素數測試
int isprime(int n) {
for(int i=2; i<=(int)sqrt(n); i++) {
if(n%i==0) {
return0;
}
}
return1;
}
在上面這個素數測試的例子中,基本運算是整除;時間複雜度T(n)=是正確的。當被測的數n爲偶數時,基本運算一次也沒執行,所以T(n)= 是錯誤的,因爲沒有辦法證明T(n)的下界是
3)漸近下界記號:Ω(big-omega)
定義:設f(n)和g(n)是定義域爲自然數集N上的函數。若存在正數c和n0,使得對一切n≥n0都有0≤cg(n)≤f(n)成立,則稱f(n)的漸進的下界是g(n),記作f(n)=Ω(g(n))。通俗的說n滿足一定條件範圍內,函數f(n) 的階不低於函數g(n)。
根據符號Ω的定義,用它評估算法的複雜度得到的只是問題規模充分大時的一個下界。這個下界的階越高,評估越精確,越有價值。
顯然,Ω(n2) 作爲下界更爲精確。
4)非漸近緊確上界:o(小-oh)
定義1:設f(n)和g(n)是定義域爲自然數集N上的函數。若對於任意正數c,都存在n0,使得對一切n≥n0都有0≤f(n)由O記號提供的漸近上界可能是漸近緊確的,也可能是非緊確的。(如:2=O()是漸近緊確的,而2n=O()是非緊確上界。)
例子:f(n)=+n則f(n)=o()
5)非漸近緊確下界:ω(小-omege)
定義1:設f(n)和g(n)是定義域爲自然數集N上的函數。若對於任意正數c,都存在n0,使得對一切n≥n0都有0≤cg(n)
ω記號與Ω的關係類似於o和O記號的關係。我們用ω表示一個非漸近緊確的下界。
例子:f(n)=+n,則f(n)=ω(n)是正確的。f(n)=ω()則是錯誤的,f(n)=Ω()是正確的。
2. 漸近記號Θ、Ο、o、Ω、ω關係
給出這些記號的定義:
對於定義的注意點:
(1)這些定義的前提是f(n)和g(n)是漸近非負的,漸近非負的意思是“當n趨於無窮大時,f(n)和g(n)都非負”。
(2)對於第4和第5條定義,需要注意是對於任意的c。
用集合論來表示這5個符號的關係:
從上面的圖可以看出:
(1)如果f(n)=Θ(g(n)),則f(n)=O(g(n))且f(n)=Ω(g(n))。
(2)如果f(n)= o (g(n)),則f(n)=O(g(n))。
(3)如果f(n)=ω(g(n)),則f(n)=Ω(g(n))。
(4)如果f(n)=O(g(n)),則要麼是f(n)= o (g(n)),要麼是f(n)=Θ(g(n))。
(5)如果 f(n)=Ω(g(n)) ,則要麼是f(n)=ω(g(n)),要麼是f(n)=Θ(g(n))。
記號 含義 通俗理解
(1)Θ(西塔)緊確界。相當於"="
(2)O (大歐)上界。相當於"<="
(3)o(小歐)非緊的上界。相當於"<"
(4)Ω(大歐米伽)下界。相當於">="
(5)ω(小歐米伽)非緊的下界。相當於">"