【數據結構】6_算法效率的度量

常見的時間複雜度

image.png

常見時間複雜度的比較

image.png

當算法的時間複雜度爲 O(2n)(n爲指數),O(n!),或O(nn)(n爲指數)時,即便n的值很小,實際的程序運行時間也是不可接收的。ios


算法的最好與最壞狀況

意義:當算法在最壞狀況下仍然能知足需求時,能夠推斷,算法的最好狀況和平均狀況都能知足需求。面試

算法分析示例
int find(int a[], int n, int v)
{
    int ret = -1;
    
    for (int i=0; i<n; ++i)
    {
        if (a[i] == v)
        {
            ret = i;
            break;
        }
    }
    
    return ret;
}

int main()
{
    int arr[5] = {1,2,3,4,5};

    int min = find(arr, 5, 1);  // 最好狀況,執行1次循環,O(1)
    
    int max = find(arr, 5, 5);  // 最壞狀況,執行n次循環,O(n)
}

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

算法的空間複雜度(Space Complexity)

  • 定義: S(n) = S(f(n))數組

    • n 爲算法的問題規模
    • f(n) 爲空間使用函數,與n相關

推導時間複雜度的方法一樣適用於空間複雜度
例如:
當算法所須要的空間是常數時,空間複雜度爲S(1)數據結構

空間複雜度計算練習

long sum1(int n)                // 1
{
    long ret = 0;               // 1
    int *array = new int[n];    // n
    
    for (int i=0; i<n; ++i)     // 1
    {
        array[i] = i + 1;
    }
    
    for (int i=0; i<n; ++i)     // 1
    {
        ret += array[i];
    }
    
    delete[] array;
    
    return ret;
}

所需的單元內存: n + 4
空間複雜度:S(n+4) = S(n)函數

空間與時間的策略

  • 多數狀況下,算法的時間複雜度更使人關注
  • 若是有必要,能夠經過增長額外空間下降時間複雜度
  • 同理,能夠經過增長算法的耗時下降空間複雜度

以上策略的依據:當前硬件的發展速度超過了軟件的發展速度spa

實例分析:空間換時間

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

輸出:設計

3
6

面試題

當兩個算法的大O表示法相同時,是否意味着兩個算法的效率徹底相同?

答:只能說效率同等級別,不能說徹底相同。由於大O表示法只關注操做數量的最高次項3d

小結

  • 通常而言,工程中使用的算法,時間複雜度不超過O(n3)(3爲指數)
  • 算法分析與設計時,重點考慮最壞狀況下的時間複雜度
  • 數據結構課程終重點關注算法的時間複雜度
  • 大O表示法一樣適用於空間複雜度
  • 空間換時間是工程中經常使用的策略

以上內容參考狄泰軟件學院系列課程,請你們保護原創!code

相關文章
相關標籤/搜索