複雜性的計量
演算法的複雜性是演算法運行所需要的電腦資源的量,需要的時間資源的量稱作時間複雜性,需要的空間(即儲存空間)資源的量稱作空間複雜性。這個量應該集中反映演算法中所採用的方法的效率,而從運行該演算法的實際電腦中抽象出來。換句話說,這個量應該是只依賴於演算法要解的問題的規模、演算法的輸入和演算法本身的函數。如果分別用N、I和A來表示演算法要解問題的規模、演算法的輸入和演算法本身,用C表示演算法的複雜性,那麼應該有:
C =F(N,I,A)
其中F(N,I,A)是N,I,A的一個確定的三元函數。如果把時間複雜性和空間複雜性分開,並分別用T和S來表示,那麼應該有:
T =T(N,I,A) (2.1)
和 S =S(N,I,A) (2.2)
通常,我們讓A隱含在複雜性函數名當中,因而將(2.1)和(2.2)分別簡寫為
T =T(N,I)
和 S =S(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)。那麼有:
(2.3)
其中ti,i=1,2,..,k,是與N,I無關的常數。
顯然,我們不可能對規模N的每一種合法的輸入I都去統計ei(N,I),i=1,2,…,k。因此T(N,I)的運算式還得進一步簡化,或者說,我們只能在規模為N的某些或某類有代表性的合法輸入中統計相應的ei , i=1,2,…,k,評價時間複雜性。
下面只考慮三種情況的複雜性,即最壞情況、最好情況和平均情況下的時間複雜性,並分別記為Tmax(N )、Tmin(N)和Tavg(N )。在數學上有:
(2.4)
(2.5)
(2.6)
其中,DN是規模為N的合法輸入的集合;I *是DN中一個使T(N,I *)達到Tmax(N)的合法輸入,是DN中一個使T(N,)到Tmin(N)的合法輸入;而P(I)是在演算法的應用中出現輸入I 的機率。
以上三種情況下的時間複雜性各從某一個角度來反映演算法的效率,各有各的用處,也各有各的局限性。但實踐表明可操作性最好的且最有實際價值的是最壞情況下的時間複雜性。下面我們將把對時間複雜性分析的主要興趣放在這種情形上。
一般來說,最好情況和最壞情況的時間複雜性是很難計量的,原因是對於問題的任意確定的規模N達到了Tmax(N)的合法輸入難以確定,而規模N的每一個輸入的機率也難以預測或確定。我們有時也按平均情況計量時間複雜性,但那時在對P(I)做了一些人為的假設(比如等機率)之後才進行的。所做的假設是否符合實際總是缺乏根據。因此,在最好情況和平均情況下的時間複雜性分析還僅僅是停留在理論上。
現在以上一章提到的問題1的演算法Search為例來說明如何利用(2.4)-(2.6)對它的Tmax、Tmin和Tavg進行計量。這裡問題的規模以m計算,演算法重用到的元運算有賦值、測試和加法等三種,它們每執行一次所需的時間常數分別為a,t,和s 。對於這個例子,如假設c在A中,那麼容易直接看出最壞情況的輸入出現在c=A[m]的情形,這時:
Tmax(m)=a+2mt+(m-1)s+(m-1)a+t+a=(m+1)a+(2m+1)t+(m-1)s (2.7)
而最好情況的輸入出現在c=A[1]的情形。這時:
(2.8)
至於Tavg(m),如前所述,必須對Dm上的機率分布做出假設才能計量。為簡單起見,我們做最簡單的假設:Dm上的機率分布是均等的,即P(A[i]=c)=1/m 。若記Ti=T(m,Ii),其中Ii表示A[i]=c的合法輸入,那麼:
(2.9)
而根據與(2.7)類似的推導,有:
代入(2.9) ,則:
這裡碰巧有:
Tavg(m)=(Tmax(m)+Tmin(m))/2
但必須指出,上式並不具有一般性。
類似地,對於演算法B_Search照樣可以按(2.4)-(2.6)計算相應的Tmax(m)、Tmin(m)和Tavg(m)。不過,我們這裡只計算Tmax(m) 。為了與Search比較,仍假設c在A中,即最壞情況的輸入仍出現在c=A[m]時。這時,while迴圈的迴圈體恰好被執行了logm +1 即k+1 次。因為第一次執行時資料的規模為m,第二次執行時規模為m/2等等,最後一次執行時規模為1。另外,與Search少有不同的是這裡除了用到賦值、測試和加法三種原運算外,還用到減法和除法兩種元運算。補記後兩種元運算每執行一次所需時間為b和d ,則可以推演出:
(2.10)
比較(2.7)和(2.10) ,我們看到m充分大時,在最壞情況下B_Search的時間複雜性遠小於Search的時間複雜性。