本次數據結構復習重點復習了第一章緒論中關於時間復雜度的計算。一下簡要介紹一下復習結果:
一個語句的頻度是指該語句在算法中被重復執行的次數。算法中所有語句的頻度之和記為T(n),它是該算法問題規模n的函數,時間復雜度主要分析T(n)的數量級。算法中的基本運算(最深層循環內的語句)的頻度與T(n)同數量級,因此通常采用算法中基本運算的頻度ƒ(n)來分析算法的時間復雜度。因此,算法的時間復雜度記為:
T(n)=Ο(ƒ(n))
式中,Ο的含義時T(n)的數量級,其嚴格的數學定義是:若T(n)和ƒ(n)是定義在正整數集合上的兩個函數,則存在正常數C和n0 使得當n≥n0時,都滿足0≤T(n)≤Cƒ(n)。
在分析一個程序的時間復雜性時,有一下兩條規則:
a)加法規則: T(n)=T1(n)+T2(n)=Ο(ƒ(n))+O(g(n)) = O(max(ƒ(n),g(n))
b)乘法規則:T(n)=T1(n)*T2(n)=O(ƒ(n))+O(g(n))=O(ƒ(n)*g(n))
常見的漸進時間復雜度為:
O(1)<O(log2n)<O(n)<O(nlog2n)<P(n2)<O(n3)<O(2n)<O(n!)<O(nn)
以下是一些題目回顧:
1.求下述代碼的時間復雜度
void fun (int n) { int i = 1; while (i <= n) i = i * 2; }
基本運算是
i = i * 2
設其執行次數為t,則2t≤n,即t≤log2n,因此復雜度T(n)=O(log2n)。
2.下列函數的時間復雜度為:
int func (int n) { int i = 0, sum = 0; while (sum < n) sum += ++i; return i; }
sum += ++i;
相當於
++i;
sum = sum + i;
進行到k次循環時,sum = (1+k)*k/2。需要O(n1/2)復雜度。
3.一個算法所需時間由下述遞歸方程表示,試求出該算法時間復雜度級別:
T(n)=1 當n=1;
T(n)=2T(n/2)+n 當n>1;
式中,n是問題規模,為簡單起見,設n是2的整數次冪。
此題目可以使用主定理解決。當T(n)=aT(n/b)+ƒ(n)時:1)ƒ(n)=O(nlogab-ε) ε>0 T(n)=θ(nlogba) 2) ƒ(n)=θ(nlogba) 那么 T(n)=θ(nlogbalog2n) 3)ƒ(n)=Ω(nlogba+ε)且對C≤1有充分大的n有aƒ(n/b)≤Cƒ(n) T(n)=θ(ƒ(n))。
滿足主定理2),因此復雜度O(nlog2n).