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