時間複雜度
乙個語句的頻度是指該語句在演算法中被重複執行的次數。演算法中所有語句的頻度之和記作 t(n) ,它是演算法的問題規模 n 的函式,時間複雜度主要分析 t(n) 的數量級。演算法中基本運算(最深層迴圈內的語句)的頻度與 t(n) 同數量級,因此通常採用演算法中基本運算的頻度 f(n) 來分析演算法的時間複雜度。因此,演算法的時間複雜度可以記為:
t (n
)=o(
f(n)
)t(n) = o(f(n))
t(n)=o
(f(n
))o 的含義是 t(n) 的數量級,其數學定義是:t(n) 和 f(n) 是定義在正整數集合上的兩個函式,則存在正常數c和 n0 ,使得當n >= n0 時,都滿足 0<=t(n)<=cf(n)
結合以上描述,從數學意義上講,t(n) 是函式 f(n) 的下界。
對於如下程式段:
int a = n;
while (a>0)
return n;
當 n 的值大於0的時候,基本運算 「a–」 會執行 n 次,直到 n = 0 ;這時a–執行的頻度 f(n) = n ;
當 n 的值小於或等於 0 的時候,基本運算 「a–」 會執行 0 次,這時 a-- 執行的頻度為 f(n) = 0;
可以看到,程式基本運算的執行次數,除了和程式本身有關外,還和輸入的 n 的值有關係
所以,乙個程式在執行的時候,根據基本運算被執行的次數,可以將複雜度分為最壞的時間複雜度,平均的時間複雜度,最好的時間複雜度。
在分析乙個程式的執行效率的時候,一般都是考慮最壞情況下的時間複雜度。還是以上面的程式段作為例子,那麼該程式段的時間複雜度為 t(n) = n ;
加法規則:
t (n
)=t1
n+t2
(n)=
o(f(
n))+
o(g(
n))=
o(ma
x(f(
n),g
(n))
t(n) = t_1n+t_2(n)=o(f(n))+o(g(n))=o(max(f(n),g(n))
t(n)=t
1n+
t2(
n)=o
(f(n
))+o
(g(n
))=o
(max
(f(n
),g(
n))乘法規則:
t (n
)=t1
(n)∗
t2(n
)=o(
f(n)
∗o(g
(n))
=o(f
(n)∗
g(n)
)t(n) = t_1(n)*t_2(n)=o(f(n)*o(g(n))=o(f(n)*g(n))
t(n)=t
1(n
)∗t2
(n)
=o(f
(n)∗
o(g(
n))=
o(f(
n)∗g
(n))
常見的漸進時間複雜度比較:
o (1
) log2 n) n) nlog 2n ) n2 ) n3 ) n3 ) 2n ) n! ) nn )o(1)o( 1)log2 n)n) nlog 2n) n2)n3 )n3)2n )n!)nn ) 1 for迴圈 一次for迴圈的執行時間至多是該for迴圈內語句的執行時間乘以迭代次數。2 巢狀的for迴圈 肯定是計算最內層迴圈語句的執行次數,然後再乘以所以迴圈的迭代次數。3 整個程式 其實找到迴圈迭代次數最多,巢狀最多的進行計算就好。3 當然,我們計算的只是大概值,而且為了計算的簡便,我們一邊... 1.演算法的特性 輸入 input 乙個演算法有0個或多個輸入,以刻畫運算物件的初始情況,所謂0個輸入是指演算法本身定出了初始條件 輸出 output 乙個演算法有乙個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的。可以在控制台列印輸出或者返回乙個或多個值等。確定性 defi... 1.演算法的特性 輸入 input 乙個演算法有0個或多個輸入,以刻畫運算物件的初始情況,所謂0個輸入是指演算法本身定出了初始條件 輸出 output 乙個演算法有乙個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的。可以在控制台列印輸出或者返回乙個或多個值等。確定性 defi...資料結構時間複雜度計算
資料結構 時間複雜度計算
資料結構 時間複雜度計算