當輸入規模大到使執行時間只和增長的量級有關時,就是在研究演算法的漸近效率。就是說,從極限角度看,我們只關心演算法執行時間如何隨著輸入規模的無限增長而增長。
表示演算法的漸近執行時間的記號是用定義域為自然數集n
= 的函式來定義的。這些記號便於用來表示最壞情況執行時間 t ( n )。
對乙個給定的函式 g ( n ),用 θ ( g ( n ))來表示函式集合:
對任何乙個函式 f ( n ),若存在正常數 c1
, c2
,使當 n 充分大時, f ( n )能被夾在 c1 g ( n )和 c2 g ( n )之間,則 f ( n )屬於集合 θ ( g ( n ))。可以寫成「 f( n ) ∈ θ ( g ( n ))」表示 f ( n )是 θ ( g ( n ))的元素。不過,通常寫成「 f ( n ) = θ ( g ( n ))」來表示相同的意思。
上圖給出了函式 f ( n )和 g ( n )的直觀圖示,其中 f ( n ) = θ ( g ( n ))。對所有位於 n0
右邊的 n 值, f ( n )的值落在 c1 g ( n )和 c2 g ( n )之間。換句話說,對所有的 n >= n0
, f ( n )在乙個常數因子範圍內與 g ( n )相等。我們說 g ( n )是 f ( n )的乙個漸近確界。
θ ( g ( n ))的定義要求每個成員 f ( n ) ∈ θ ( g ( n ))都是漸近非負,就是說當 n 足夠大時 f ( n )是非負值。這就要求函式 g ( n )本身也是漸近非負的,否則集合 θ ( g ( n ))就是空集。
θ 記號的效果相當於捨棄了低階項和忽略了最高端項的係數。
θ 記號漸近地給出了乙個函式的上界和下界。當只有漸近上界時,使用 o 記號。對乙個函式 g ( n ),用 o ( g ( n ))表示乙個函式集合:
上圖說明了 o 記號的直觀意義。對所有位於 n0
右邊的 n 值,函式 f ( n )的值在 g ( n )下。
ω 記號給出了函式的漸近下界。給定乙個函式 g ( n ),用 ω ( g ( n ))表示乙個函式集合:
上圖說明了 ω 記號的直觀意義。對所有在 n0
右邊的 n 值,函式 f ( n )的數值等於或大於 c g ( n )。
定理
對任意兩個函式 f ( n )和 g ( n ), f ( n ) = θ ( g ( n ))當且僅當 f ( n ) = o ( n )和 f ( n ) = ω ( g ( n ))。
o 記號提供的漸近上界可能是也可能不是漸近緊確的。這裡用 o 記號表示非漸近緊確的上界。 o ( g ( n ))的形式定義為集合:
o 記號與 o 記號的主要區別在於對 f ( n ) = o ( g ( n )),界0 <= f ( n ) <= c g ( n )對某個常數 c > 0成立;但對 f ( n ) = o ( g ( n )),界0 <= f ( n ) <= c g ( n)對所有常數 c > 0都成立。即
我們用 ω 記號來表示非漸近緊確的下界。 ω ( g ( n ))的形式定義為集合:
關係 f ( n ) = ω ( g ( n ))意味著
如果這個極限存在。也就是說當 n 趨於無窮時, f ( n )相對 g ( n )來說變得任意大了。
設 f ( n )和 g ( n )是漸近正值函式。
傳遞性:
f ( n ) = θ ( g ( n ))和 g ( n ) = θ ( h ( n )) 蘊含 f ( n ) = θ ( h ( n ))
f ( n ) = o ( g ( n ))和 g ( n ) = o ( h ( n )) 蘊含 f ( n ) = o ( h ( n ))
f ( n ) = ω ( g ( n ))和 g ( n ) = ω ( h ( n )) 蘊含 f ( n ) = ω ( h ( n ))
f ( n ) = o ( g ( n ))和 g ( n ) = o ( h ( n )) 蘊含 f ( n ) = o ( h ( n ))
f ( n ) = ω ( g ( n ))和 g ( n ) = ω ( h ( n )) 蘊含 f ( n ) = ω ( h ( n ))
自反性:
f ( n ) = θ ( f ( n ))
f ( n ) = o ( f ( n ))
f ( n ) = ω ( f ( n ))
對稱性:
f ( n ) = θ ( g ( n ))當且僅當 g ( n ) = θ ( f ( n ))
轉置對稱性:
f ( n ) = o ( g ( n ))當且僅當 g ( n ) = ω ( f ( n ))
f ( n ) = o ( g ( n ))當且僅當 g ( n ) = ω ( f ( n ))
讀書筆記 演算法導論
第2章演算法入門 浮於表面不如深入其中,送給自己,自己是最大的敵人,那麼就盡最大努力去克服自己,沉思,冷靜,不浮躁!勘誤 在演算法導論第9頁,扼要的扼 內容提要 1 偽 的表示方法 2 插入排序演算法分析 3 迴圈不變式 4 演算法設計之分治法 divide and conquer 5 合併排序演算...
演算法導論 讀書筆記2010 12 6
演算法就是一系列的計算步驟,用來將輸入資料轉換為輸出結果。資料結構師儲存和組織資料的一種方式,以便於對資料進行訪問和修改。插入排序演算法,對n個資料項的時間大約是c1n 2,其中c1是乙個不依賴於n的常量。亦即該演算法所需的時間大致與n 2成正比。合併排序演算法,排序n個資料項的時間大約是c2log...
《演算法導論》讀書筆記(一)
理解 輸入到輸出的計算過程稱為演算法。1.演算法描述 2.證明演算法正確性 3.分析演算法效率 兩個例子 1.插入排序 思想 從未排序的序列中取出乙個元素,將其插入到已排序序列的正確位置。實現 include include using namespace std int main for int ...