1. 程式人生 > 其它 >演算法的時間複雜度(Time Complexity)

演算法的時間複雜度(Time Complexity)

時間複雜度(Time Complexity)不是度量具體一個演算法具體的耗時是多少。時間複雜度通常用大O表示法,它不包括這個函式的低階項和首項係數,可以表示為T[n]=O(f(n)),稱函式T(n)以f(n)為界或者稱T(n)受限於f(n)。 如果一個問題的規模是n,解這一問題的某一演算法所需要的時間為T(n)。大O表示法給出的是一個上界,而非一個上確界。

大O符號是由德國數論學家保羅·巴赫曼(Paul Bachmann)在其1892年的著作《解析數論》(Analytische Zahlentheorie)首先引入的。

常見的時間複雜度量級有:

  • 常數階O(1)
  • 對數階O(logN)
  • 線性階O(n)
  • 線性對數階O(nlogN)
  • 平方階O(n²)
  • 立方階O(n³)
  • K次方階O(n^k)
  • 指數階(2^n)

常數階O(1)

// 無論程式碼有多少行,只要沒有迴圈等結構,那麼時間複雜度就是O(1)。
int x = 13;
x = x + 1;
x = x + 1;
x = x + 1;
x = x + 1;
x = x + 1;
x = x + 1;
x = x + 1;
x = x + 1;
x = x + 1;

對數階O(logN)

public void main()
{
    int i = 1;
    while(i<n)
    {
        // i在每個迴圈都將乘以2,假設迴圈x次之後,i就大於n,迴圈退出,程式結束,那麼2^x=n => x=log2(n),所以時間複雜度為:O(logN)
i = i * 2; } }

線性階O(n)

public void main()
{
    int i = 1;
    while(i<n)
    {
        // 執行迴圈x次後,程式退出,那麼x=n => O(n)。
        // 如果i=i+2,時間複雜度同樣是O(n),因為2x=n => O(n/2) => O(n),因為當n接近於無窮大的時候,常量可以忽略。
        i = i + 1;
    }
}

線性對數階O(nlogN)

public void main()
{
    int i = 1;
    
while(i<n) { for(int j=1;j<n;j++) j = j*2; } }

平方階O(n²)

public void main()
{
    for(int i=1;i<n;i++)
        for(int j=1;j<n;j++)
            j = j+1;
    }
}

立方階O(n³)

public void main()
{
    for(int i=1;i<n;i++)
        for(int j=1;j<n;j++)
            for(int k=1;k<n;k++)
                k = k+1;
    }
}

K次方階O(n^k)

與立方階O(n³)類似,多層迴圈。

指數階(2^n)

比如,旅行商問題(Travelling Salesman Problem,簡稱TSP)