1. 時間復雜度
時間復雜度是指程序運行從開始到結束所需要的時間。時間復雜度的計算一般比較麻煩,故在數據結構的研究中很少提及時間復雜度。為了便於比較同一個問題的不同算法,通常做法是,從算法中選取一種對於所研究的問題來說是基本操作的原操作,以該基本操作重復執行的次數做為算法的時間量度。基本操作應是其重復執行次數和算法時間成正比的原操作,多數情況下它是最深層循環內的語句中的操作。算法的執行次數還要隨輸入集有關,此時要考慮所有可能輸入數據的期望值,此時的算法時間復雜度叫平均時間復雜度。有事平均時間復雜度難以確定,此時分析最壞情況下算法的一個上界,此時稱為最壞時間復雜度。
2. 時間復雜度的表示方法
設解決一個問題的規模為n,基本操作被重復執行次數是n的一個函數f(n),則時間復雜度可記作: T(n)=O(f(n)) 它表示隨着問題規模n的增長,算法執行時的增長率和f(n)的增長率相同。其中T(n)叫算法的漸進時間復雜度,簡稱時間復雜度。算法的時間復雜度考慮的只是對於問題規模n的增長率,則在難以精確計算的情況下,只需考慮它關於n的增長率或階即可。
例如
for(i=2;i<=n;++i) for(j=2;j<=i-1;++j) {
++x;
a[i,j]=x;
}
其中++x語句頻度為:1+2+3+…+n-2=(n-1)(n-2)/2=(n2-3n+2)/2故算法的時間復雜度可表示為:T(n)=O(n2)
3. 時間復雜度的計算方法
時間復雜的推導方法一般如下:
第一步:用常數1取代運行時間中的所有加法常數。
第二步:在修改后的運行次數函數中,只保留最高階項。
第三步:如果最高階項存在且不是1,則去除與這個項相乘的常數。
時間復雜度一般分為以下幾種,分別是:
(1)常數階 首先順序結構的時間復雜度。
main() { int sum=0,n=100; sum=(1+n)*n/2; printf(“%d”,sum); }
算法的時間復雜度為O(1)。 這個算法的運行次數函數是f(n)=3。根據我們推導的方法,第一步就是把常數項3改為1。在保留最高階項時發現,它根本沒有最高階項,所以這個算法的時間復雜度為O(1)。
(2)線性階 要確定某個算法的階次,需要確定某個特定語句或某個語句集運行的次數。因此,要分析算法的復雜度,關鍵就是要分析循環結構的運行情況。
int i; for(i=0;i<n;i++) { /*時間復雜度為O(1)的程序步驟序列*/ }
(3)對數階
int count=1; while(count<n) { count=count*2; /*時間復雜度為O(1)的程序步驟序列*/}
由於每次count乘以2之后,就距離n更近了一點。也就是說,有多少個2相乘后大於n,則會退出循環。由2x=n得到x=log2n。所以這個循環的時間復雜度為O(log2n)。
(4)平方階
inti,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) { /*時間復雜度為O(1)的程序步驟序列*/ } }
循環的時間復雜度等於循環體的復雜度乘以該循環運行的次數。間復雜度為O(n2)。
4. 總結
本文主要討論算法的時間復雜度,算法時間復雜度在數據結構中是比較難的問題,通過本文給出的計算時間復雜度的方法,能夠比較容易掌握時間復雜的計算。