更新時間:2020-12-04 17:53:38 來源:動力節(jié)點 瀏覽1387次
對于剛剛開始學(xué)習(xí)算法的小伙伴來說,第一次看見時間復(fù)雜度這個詞難免有點小疑惑,似乎是一個很抽象的東西,很難去理解。實際上算法時間復(fù)雜度是一個代表算法輸入值的字符串的長度的函數(shù),它定性描述該算法的運(yùn)行時間。
一個算法執(zhí)行所耗費(fèi)的時間,從理論上是不能算出來的,必須上機(jī)運(yùn)行測試才能知道。但我們不可能也沒有必要對每個算法都上機(jī)測試,只需知道哪個算法花費(fèi)的時間多,哪個算法花費(fèi)的時間少就可以了。并且一個算法花費(fèi)的時間與算法中語句的執(zhí)行次數(shù)成正比例,哪個算法中語句執(zhí)行次數(shù)多,它花費(fèi)時間就多。一個算法中的語句執(zhí)行次數(shù)稱為語句頻度或時間頻度。記為T(n)。
上面提到的時間頻度T(n)中,n稱為問題的規(guī)模,當(dāng)n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現(xiàn)什么規(guī)律,為此我們引入時間復(fù)雜度的概念。一般情況下,算法中基本操作重復(fù)執(zhí)行的次數(shù)是問題規(guī)模n的某個函數(shù),用T(n)表示,若有某個輔助函數(shù)f(n),使得當(dāng)n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數(shù),則稱f(n)是T(n)的同數(shù)量級函數(shù),記作T(n)=O(f(n)),它稱為算法的漸進(jìn)時間復(fù)雜度,簡稱時間復(fù)雜度。
算法的執(zhí)行時間是通過依據(jù)該算法編寫的程序在計算機(jī)上執(zhí)行時所需要的時間來計算的,通常有以下兩種方法。
1.事后統(tǒng)計法:因為很多的計算機(jī)有精確的計時功能,所以可以在計算機(jī)中執(zhí)行依據(jù)某一算法編寫的程序,從而計算出該算法的執(zhí)行時間。但此時間又與所使用的編程語言,以及計算機(jī)的硬件和軟件等環(huán)境因素有關(guān),有時容易掩蓋算法本身的優(yōu)劣,因此很少使用。
2.事前分析估算法:通常用高級程序設(shè)計語言編寫的程序在計算機(jī)上運(yùn)行時消耗的時間取決于下列因素。
① 算法選用何種策略。
② 問題的規(guī)模。
③ 所使用的程序設(shè)計語言,就同一個算法而言,用級別越高的語言實現(xiàn),其執(zhí)行的效率越低。
④ 編譯程序所產(chǎn)生的機(jī)器代碼的質(zhì)量。
⑤ 機(jī)器執(zhí)行指令的速度。
由上述因素可以看出,采用絕對的時間單位來衡量一個算法的效率是不合理的,因此我們撇開所使用的編程語言、計算機(jī)的硬件和軟件等環(huán)境因素,僅考慮算法本身效率的高低。即認(rèn)為某一算法的執(zhí)行時間只依賴于問題的規(guī)模,或者說是問題規(guī)模的函數(shù)。也就是說同一個算法的時間復(fù)雜度不是一成不變的,和輸入的數(shù)據(jù)形式依然有關(guān)系。而我們面試中如果被問道算法的時間復(fù)雜度是多少,實際上指的都是一般情況下的數(shù)據(jù)形式。
算法復(fù)雜度分為時間復(fù)雜度和空間復(fù)雜度。本文我們主要介紹的是算法的時間復(fù)雜度,想了解算法的空間復(fù)雜度可以觀看本站的數(shù)據(jù)結(jié)構(gòu)和算法教程,帶你揭秘算法的各種神奇之處!

初級 202925

初級 203221

初級 202629

初級 203743