博客 / 詳情

返回

時間複雜度 - 記錄筆記

時間複雜度分析

概念
將算法中執行 基本操作 的次數作為這個算法的時間複雜度的考量,這裏所説的“時間”不是指執行一段程序的總時間,而是指基本操作(算法)的執行總次數
思路
明確算法中哪些操作是基本的核心操作與問題規模,計算出規模n的函數f(n),求T(n)=O(f(n)中增長最快的項/此項的係數);將能使基本操作執行次數最多的輸入作為計算時間複雜度的入參,即:將最壞的情況作為算法時間複雜度的度量
公式
T(n)=O(f(n)中增長最快的項/此項的係數)
例:f(n)=2n³+4n²+100,則T(n)=O(2n³/2)=O(n³)
常用的時間複雜度比較關係
O(1) ≤ O(log₂(n)) ≤ O(n) ≤ O(nlog₂(n)) ≤ O(n²) ≤ O(n³) ≤ ··· ≤ O(nᵏ) ≤ O(2ⁿ)
例題舉例

求以下算法的時間複雜度

void fun(int n)
{
    int i = 1, j = 100;
    while (i < n)
    {
        ++j;
        i+=2;
    }
}

一:找出基本操作,確定規模n

1、先找出基本操作。基本操作是以求時間複雜度為目的前提下,基本操作重複執行次數和算法執行時間成正比的操作,多數情況取最深層循環內的語句為算法的基本操作;
  ++j與i+=2,可以作為基本操作

2、確定規模。由while的條件:i<n,可以得知基本操作的執行次數,與入參的參數n有關,所以n就是規模n

二:計算n的函數f(n)

n確定後,while循環的結束與變量i有關

i的初始值為1,每循環一次就自增2,設循環的次數為“m”
則循環結束後,i的最終值的函數公式為:1+2m(初始值+每次循環自增的值*循環次數)

    因此,得到1+2m+K=n(n為算法規模,K為常數,因為i在循環結束後的值大於n,所以要加一個常數)
    解得m=(n-1-K)/2
    
    即f(n)=(n-1-K)/2
    f(n)中增長最快的項為n/2,n與f(n)的關係是線性關係,

    所以得出時間複雜度T(n)=O(n)
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.