【數據結構實戰C++】6 算法效率的度量

【數據結構實戰C++】6 算法效率的度量

作者 CodeAllen ,轉載請註明出處


常見的時間複雜度

在這裏插入圖片描述

常見時間複雜度的比較

O(1)< O(logn)<O(n)<O(n*logn)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

基本身算法時間複雜度是O(2n)O(n!)O(nn)
的時候,運行時間就是不可接受的了

實例分析
在這裏插入圖片描述

分最好情況和最壞情況
在這裏插入圖片描述

一般沒有特殊說明,分析算法的時間複雜度都是指最壞時間複雜度

算法的空間複雜度(space complexity)

-S(n) = S(f(n))
n爲算法的問題規模
f(n)是空間使用函數,與n有關

空間複雜度實例
在這裏插入圖片描述
在這裏插入圖片描述

所需要的單位內存 : n +4
空間複雜度 :S(n + 4) = S(n)

空間與時間的策略

  • -多數情況下,算法的時間複雜度更關注
  • -有必要的話,可以通過增加額外的空間降低時間複雜度
  • -同理,也可以通過增加算法的耗時降低空間複雜度

實例分析:空間換時間

/*
    問題:
    在一個由自然數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]++;
    }
    
    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;
}

面試題:當兩個算法的的大O表示法相同時,是夠意味着兩個算法的效率完全一樣?

只能說明是同一個級別的,但是不能說明複雜度相同

小結
一般工程中,時間複雜度不超過0(n^3)
算法分析中,重點考慮的是最壞時間複雜度,時間複雜度也是最關注的
大O表示法童謠適合算法的空間複雜度
空間換時間是工程中經常用的策略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章