算法的复杂度分析
文章目錄
- 1 算法效率的度量
- 1.1 算法效率度量的方法
- 1.2 事后統(tǒng)計(jì)法
- 1.3 事前分析估算法
- 2 算法的復(fù)雜度
- 2.1 算法的復(fù)雜度
- 2.2 算法的時(shí)間復(fù)雜度
- 2.3 算法的空間復(fù)雜度
1 算法效率的度量
1.1 算法效率度量的方法
思考:如果兩個(gè)算法都滿足功能性需求,那工程中最關(guān)心的其它特性是什么?如何比較評判呢?
注意:性價(jià)比(比率)是工程中最關(guān)注的算法附件特性!
算法效率度量的方法主要分為兩種:事后統(tǒng)計(jì)法和事前分析估算法。
1.2 事后統(tǒng)計(jì)法
比較不同算法對同一組輸入數(shù)據(jù)的運(yùn)行處理時(shí)間。
缺陷:
- 為了獲得不同算法的運(yùn)行時(shí)間必須編寫相應(yīng)程序。
- 運(yùn)行時(shí)間嚴(yán)重依賴硬件以及運(yùn)行時(shí)的環(huán)境因素。
- 算法的測試數(shù)據(jù)的選取相當(dāng)困難。
事后統(tǒng)計(jì)法不容易準(zhǔn)確度量算法的效率。
1.3 事前分析估算法
依據(jù)統(tǒng)計(jì)的方法對算法效率進(jìn)行估算。
影響算法效率的主要因素:
事前分析估算法通過操作數(shù)量度量算法效率。
判斷一個(gè)算法效率時(shí)只需要關(guān)注最高階項(xiàng)就能得出結(jié)論。某個(gè)算法,隨著問題規(guī)模n的增大,它會(huì)越來越優(yōu)于另一個(gè)算法,或者越來越差于另一個(gè)算法。
結(jié)論:判斷一個(gè)算法的效率時(shí),操作數(shù)量中的常數(shù)項(xiàng)和其他次要項(xiàng)常常可以忽略,只需要關(guān)注最高階項(xiàng)就能得出結(jié)論。
2 算法的復(fù)雜度
2.1 算法的復(fù)雜度
問題:如何用符號(hào)定性的判斷算法的效率?
算法的復(fù)雜度:
- 時(shí)間復(fù)雜度:算法運(yùn)行后對事件需求量的定性描述。
- 空間復(fù)雜度:算法運(yùn)行后對空間需求量的定性描述。
注意:
- 數(shù)據(jù)結(jié)構(gòu)課程重點(diǎn)關(guān)注的是算法的效率問題,因此,整個(gè)課程會(huì)集中于討論算法的時(shí)間復(fù)雜度;但其使用的方法完全可以用于空間復(fù)雜度的判斷!
2.2 算法的時(shí)間復(fù)雜度
時(shí)間復(fù)雜度是算法運(yùn)行時(shí)對于時(shí)間的需求量,大O表示法用于描述算法的時(shí)間復(fù)雜度,大O表示法只關(guān)注操作數(shù)量的最高次項(xiàng)。
大O表示法:
- 算法效率嚴(yán)重依賴于操作(Operation)數(shù)量。
- 操作數(shù)量的估算可以作為時(shí)間復(fù)雜度的估算。
- 在判斷時(shí)首先關(guān)注操作數(shù)量的最高次項(xiàng)。
常見的時(shí)間復(fù)雜度如下:
常見的時(shí)間復(fù)雜度列出如下:
常見的時(shí)間復(fù)雜度的比較:
一般而言,工程中使用的算法,時(shí)間復(fù)雜度不超過O(n^3)。
算法分析示例:
算法的最好與最壞情況:
- 當(dāng)算法在最壞情況下仍然能滿足需求時(shí),可以推斷,算法的最好情況和平均情況都滿足需求。
- 一般情況下,如果沒有特殊說明,我們所分析算法的時(shí)間復(fù)雜度都是指最壞時(shí)間復(fù)雜度。
2.3 算法的空間復(fù)雜度
算法的空間復(fù)雜度(Space Complexity):
- 定義:S(n) = S(f(n))
- n為算法的問題規(guī)模。
- f(n)為空間使用函數(shù),與n相關(guān)。
推到時(shí)間復(fù)雜度的方法同樣適用于空間復(fù)雜度,例如:當(dāng)算法所需要的空間是常數(shù)時(shí),空間復(fù)雜度為S(1)。
空間復(fù)雜度計(jì)算示例:
空間與時(shí)間的策略:
- 多數(shù)情況下,算法的時(shí)間復(fù)雜度更令人關(guān)注。
- 如果有必要,可以通過增加額外空間降低時(shí)間復(fù)雜度。
- 同理,也可以通過增加算法的耗時(shí)降低空間復(fù)雜度。
實(shí)例分析:空間換時(shí)間
/*問題: 在一個(gè)由自然數(shù)1-1000中某些數(shù)字所組成的數(shù)組中,每個(gè)數(shù)字可能出現(xiàn)零次或者多次。設(shè)計(jì)一個(gè)算法,找出出現(xiàn)次數(shù)最多的數(shù)字。 */#include <iostream>using namespace std;void search(int a[], int len) // O(n) {int sp[1000] = {0};int max = 0;for(int i=0; i<len; i++){sp[a[i] - 1]++;}for(int i=0; i<1000; i++){if( max < sp[i] ){max = sp[i];}}for(int i=0; i<1000; i++){if( max == sp[i] ){cout << i + 1 << endl;}} }int main(int argc, char* argv[]) {int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};search(a, sizeof(a)/sizeof(*a));return 0; }面試題:當(dāng)兩個(gè)算法的大O表示法相同時(shí),是否意味著兩個(gè)算法的效率完全相同?
- 不相同,只是在一個(gè)數(shù)量級(jí)上。
參考資料:
總結(jié)
- 上一篇: 双任务时间片运行原理
- 下一篇: 双任务延时原理与空闲任务