1. 程式人生 > >第六課、算法效率的度量

第六課、算法效率的度量

分享 turn 結構 sin 效率 mage alt exit 額外

一、常見的時間復雜度

技術分享

常見時間復雜度的比較

技術分享

二、算法分析

技術分享

定義一個數組

技術分享

此算法最好的情況時執行一次

技術分享

而最壞的情況卻要執行n次

技術分享

註意:數據結構課程中,在沒有特殊說明時,所分析算法的時間復雜度都是指最壞時間復雜度

三、算法的空間復雜度(space complexity)

(1)、定義:S(n) = S(f(n))

n為算法的問題規模

f(n)為空間使用函數,與n相關

註:推導時間復雜度的方法同樣適應空間復雜度

如:當算法所需空間是常數時,空間復雜度為S(1)

(2)、空間復雜度計算練習

技術分享

四、時間與空間算法策略

(1)、多數情況下,算法的時間復雜度令人關註

(2)、如果有必要,可以通過增加額外空間降低時間復雜度

(3)、同理,也可以通過增加算法的耗時降低空間復雜度

時間換空間的例子

/*
    問題: 
    在一個由自然數1-1000中某些數字所組成的數組中,每個數字可能出現零次或者多次。
    設計一個算法,找出出現次數最多的數字。
*/

#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]++;//將對應數字的總數按順序存儲起來,如將1的個數存在sp[0]的位置,將2的個數存在sp[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; }

五、小結

(1)、一般而言,工程中使用的算法,時間復雜度不超過O(n^3)

(2)、算法分析設計時,重點考慮最壞情況下的時間復雜度

(3)、數據結構課程中重點關心算法的時間復雜度

(4)、空間換時間是工程開發中常用的策略

第六課、算法效率的度量