這篇博客的內容摘自課本,針對課本中缺少的5道證明題,作為練習,給出證明。
算法運行時所需要的計算機時間資源的量稱為時間復雜性。這個量應該集中反應算法的效率,並從運行該算法的實際計算機中抽象出來。換句話說,這個量應該是只依賴於要解的問題的規模、算法的輸入和算法本身的函數。
如果分別用 N,I和A 表示算法要解的問題的規模、算法的輸入和算法本身,而且用 T 表示時間復雜性,那么,應該有 T=T(N,I,A) 。通常 A 隱含在復雜性函數名中,因而將 T 簡寫為 T(N,I) 。
現在,時間復雜性分析的主要問題是如何將復雜性函數具體化,即對於給定的 N,I和A ,如何導出 T(N,I) 的數學表達式,來給出計算 T(N,I) 的法則。
根據 T(N,I) 的概念,它應該是算法在一台抽象的計算機上運行所需要的時間。設此抽象的計算機所提供的原運算有 k 種,它們分別記為 O1,O2,...,Ok 。又設每執行一次這些元運算所需要的時間分別為 t1,t2,...,tk 。對於給定的算法 A ,設經統計,用到元運算 Oi 的次數為 ei,i=1,2,...,k 。很清楚,對於每一個 i,1≤i≤k,ei 是 N和I 的函數,即 ei=ei(N,I)
。因此有

式中, ti(i=1,2,...,k ),是與 N和I 無關的常數。
顯然,不可能對規模為 N 的每一種合法的輸入都去統計 ei(N,I),i=1,2,...,k 。因此 T(N,I) 的表達式還要進一步簡化,或者說,只能在規模為 N 的某些或某類有代表性的合法輸入中統計相應的 ei,i=1,2,...,k ,評價其時間復雜性。通常只考慮三種情況下的時間復雜性,即最壞情況、最好情況和平均情況下的時間復雜性,並分別記為 Tmax(N)、Tmin(N)和Tavg(N) 。在數學上有
式中, DN 是規模為 N 的合法輸入的集合; I∗ 是 DN 中使 T(N,I∗) 達到 Tmax(N) 的合法輸入;I∼ 是 DN 中使 T(N,I∼) 達到 Tmin(N) 的合法輸入;而 P(I) 是在算法的應用中出現輸入 I 的概率。
以上三種情況下的時間復雜性從某一角度反應算法的效率,各有局限性,也各有各的用處。實踐表明,可操作性最好且最有實際價值的是最壞情況下的時間復雜性。
為了簡化算法復雜性的分析,下面引入復雜性漸近性態的概念。
設 T(N) 是前面所定義的關於算法A的復雜性函數。一般來說,當 N 單調遞增且趨於 ∞ 時, T(N) 也將單調增加且趨於 ∞ 。對於 T(N) ,如果存在 T∼(N) ,使得當 N→∞ 時有 T(N)−T∼(N))/T(N)→0 ,那么,就說 T∼(N) 是 T(N) 當 N→∞ 時的漸近性態,或稱 T∼(N) 為算法 A 當 N→∞ 的漸近復雜性,而與 T(N) 相區別。
因為在數學上, T∼(N) 是 T(N) 當 N→∞ 時的漸近表達式。直觀上, T∼(N) 是 T(N) 中略去低階項所留下的主項,所以它無疑比 T(N) 來得簡單。比如當 T(N)=3N2+4NlogN+7 時,T∼(N) 的一個答案是 3N2 ,因為這時有
顯然, 3N2 比 3N2+4NlogN+7 簡單多了。
由於當 N→∞ , T(N) 漸近於 T∼(N) ,我們有理由用 T∼(N) 來代替 T(N) 作為算法 A 在 N→∞ 時的復雜性的度量。而且由於 T∼(N) 明顯比 T(N) 簡單,這種替換明顯的是對算法復雜性分析的一種簡化。進一步考慮到分析算法的復雜性的目的在於比較解同一個問題的兩個不同算法的效率。而當要比較的兩個算法的漸近復雜性的階不同時,只要能確定出各自的階,就可以判定出哪一個算法的效率高。換句話說,這時的漸近復雜性分析只要關心 T∼(N) 的階就夠了,不必關心包含在 T∼(N) 中的常數因子。所以,假設算法中用到的所有不同的元運算各執行一次所需要的時間都是一個單位時間。與此同時,引出以下漸近意義下的記號 O,Ω,θ和o 。
以下設 f(N)和g(N) 是定義在正數集上的正函數。
如果存在正的常數 C 和自然數 N0 ,使得當 N≥N0 時有 f(N)≤Cg(N) ,則稱函數 f(N) 當 N 充分大時上有界,且 g(N) 是它的一個上界,記為 f(N)=O(g(N)) 。這時還說 f(N) 的階不高於 g(N) 的階。
舉幾個例子:
(1)因為對於所有的 N≥1 有 3N≤4N ,所以有 3N=O(N) ;
(2)因為當 N≥1 時有 N+1024≤1025N ,所以有 N+1024N=O(N) ;
(3)因為當 N≥10 時有 2N2+11N−10≤3N3 ,所以有 2N2+11N−10=O(N2);
(4)因為對所有 N≥1 有 N2≤N3 ,所以有 N2=O(N3) ;
(5)作為一個反例, N3≠O(N2) 。因為若不然,則存在正的常數 C 和自然數 N0 ,使得當 N≥N0有N3≤CN2 ,即 N≤C 。顯然,當 N=max{N0,⌊C⌋+1} 時這個不等式不成立,所以N3≠O(N2) 。
按照符號 O 的定義,容易證明它有如下運算規則:
(1)O(f)+O(g)=O(max(f,g));
(2)O(f)+O(g)=O(f+g) ;
(3)O(f)O(g)=O(fg) ;
(4)如果g(N)=O(f(N)) ,則 O(f)+O(g)=O(f) ;
(5)O(Cf(N))=O(f(N)) ,其中 C 是一個正的常數;
(6)f=O(f) 。
下面僅給出規則(1)的證明過程,其余類似。
設 F(N)=O(f) 。根據符號 O 的定義,存在正常數 C1 和自然數 N1 ,使得對所有的 N≥N1 ,有 F(N)≤C1f(N) 。
類似地,設 G(N)=O(g) ,則存在正的常數 C2 和自然數 N2 ,使得所有的 N≥N2 ,有 G(N)≤C2g(N) 。
令 C3=max{C1,C2},N3=max{N1,N2},h(N)=max{f,g} ,則對所有的 N≥N3 ,
F(N)≤C1f(N)≤C1h(N)≤C3h(N)
類似地,有
G(N)≤C2g(N)≤C2h(N)≤C3h(N)
因而
O(f)+O(g)=F(N)+G(N)≤C3h(N)+C3h(N)≤2C3h(N)=O(h)=O(max(f,g))
O(f)+O(g)=O(f+g) 證明
設 F(N)=O(f) 。根據符號 O 的定義,存在正常數 C1 和自然數 N1 ,使得對所有的 N≥N1 ,有 F(N)≤C1f(N) 。
類似地,設 G(N)=O(g) ,則存在正的常數 C2 和自然數 N2 ,使得所有的 N≥N2 ,有 G(N)≤C2g(N) 。
令 C3=max{C1,C2},N3=max{N1,N2},則對所有的 N≥N3 ,有
F(N)≤C1f(N)≤C3f(N)
G(N)≤C2g(N)≤C3g(N)
故有:
O(f)+O(g)=F(N)+G(N)≤C3f(N)+C3g(N)=C3(f(N)+g(N))=O(f+g)
O(f)O(g)=O(fg) 證明
設 F(N)=O(f) 。根據符號 O 的定義,存在正常數 C1 和自然數 N1 ,使得對所有的 N≥N1 ,有 F(N)≤C1f(N) 。
類似地,設 G(N)=O(g) ,則存在正的常數 C2 和自然數 N2 ,使得所有的 N≥N2 ,有 G(N)≤C2g(N) 。
令 C3=C1*C2, N3=max{N1,N2}, 則對所有的 N≥N3 ,有
F(N)≤C1f(N)
G(N)≤C2g(N)
故有:
O(f)*O(g)=F(N)*G(N)≤C1f(N)*C2g(N)=C3*f(N)*g(N)=O(f*g)
O(Cf(N))=O(f(N)) ,其中 C 是一個正的常數;
對O(f(N))設 F(N)=O(f(N)) 。根據符號 O 的定義,存在正常數 C0 和自然數 N0 ,使得對所有的 N≥N0 ,有F(N)≤C0f(N) 。
因而存在正常數C0/C和自然數N0,使得對所有 N≥N0 ,F(N)≤(C0/C)*Cf(N)
因而O(Cf(N))=O(f(N))
f=O(f) 證明
設 F(N)=O(f) 。根據符號 O 的定義,存在正常數 C1 和自然數 N1 ,使得對所有的 N≥N1 ,有 F(N)≤C1f(N) 。
故有:
O(f)=F(N)≤C1f(N)=f
根據符號 O 的定義,用它評估算法的復雜性,得到的只是當規模充分大時的一個上界。這個上界的階越低,則評估的就越精確,結果就越有價值。
Ω :如果存在正的常數 C和自然數 N0 ,使得當 N≥N0 時有 f(N)≥Cg(N) ,則稱函數 f(N) 當 N 充分大時下有界;且 g(N) 是它的一個下界,記為 f(N)=Ω(g(N)) 。這時還說 f(N) 的階不低於 g(N)) 的階。
同樣要指出,用 Ω 評估算法的復雜性,得到的只是該復雜性的下界。這個下界的階越高,則評估就越精確,結果就越有價值。它常常與符號 O 配合以證明某問題的一個特定算法是該問題的最優算法或該問題的某算法類中最優算法。
定義 f(N)=θ(g,(N)) 當且僅當 f(N)=O(g(N)) 且 f(N)=Ω(g(N)) 。這時,我們說 f(N)與g(N) 同階。
最后,如果對於任意給定的 ε>0 ,都存在正整數 N0 ,使得當 N≥N0 時有 f(N)/g(N)<ε ,則稱函數 f(N) 當 N 充分大時的階比 g(N) 低,記為 f(N)=o(g(N)) 。
