從0開始學算法2:時間複雜度詳解

一、算法的選擇

我們都知道同一個問題有不同的算法解決,這些算法在運行時間、運行佔用內存、代碼易讀性等方面都不相同,而在這些算法中,我們只能選擇一種解決方案,這時判斷選擇哪個算法的依據是什麼呢?

在這裏,我們引入了時間複雜度和空間複雜度這兩個概念作爲選擇適合算法的重要依據,一般對比算法的好壞基本上從它的時間複雜度和空間複雜度來綜合判斷就可以得出哪個更適合,複雜度通常來說越小越好。

算法的時間複雜度和空間複雜度的作用:時間複雜度是指執行這個算法所需要的計算工作量;而空間複雜度是指執行這個算法所需要的內存空間。時間和空間(即寄存器)都是計算機資源的重要體現,而算法的複雜性就是體現在運行該算法時的計算機所需的資源多少

二、時間複雜度概念

一個算法語句總的執行次數是關於問題規模N的某個函數,記爲f(N),N稱爲問題的規模。語句總的執行次數記爲T(N),當N不斷變化時,T(N)也在變化,算法執行次數的增長速率和f(N)的增長速率相同。

則有T(N) = O(f(N)),這稱作算法的漸進時間複雜度,簡稱時間複雜度。

說明:

  1. 算法的時間複雜度反映了程序執行時間隨輸入規模增長而增長的量級,在很大程度上能很好地反映出算法的優劣與否。
  2. 算法執行時間需要依據該算法編制的程序在計算機上執行運行時所消耗的時間來度量,度量方法有兩種:事後統計方法和事前分析估算方法。因爲事後統計方法更多地依賴計算機的硬件、軟件等環境因素,有時容易掩蓋算法本身的優劣,因此常採用事前分析估算的方法。
  3. 一個算法是由控制結構(順序、分支、循環三種)和原操作(固有數據類型的操作)構成的,而算法時間取決於兩者的綜合效率。
  4. 一個算法花費的時間與算法中語句的執行次數成正比,執行次數越多,花費的時間就越多,其執行次數稱爲語句頻度或時間頻度,記爲T(n)。
  5. 在時間頻度中,n爲問題的規模,當n不斷變化時,它所呈現出來的規律,我們稱爲時間複雜度。
  6. 在各種算法中,若算法中的語句執行次數爲一個常數,則時間複雜度爲o(1),同時,若不同算法的時間頻度不一樣,但他們的時間複雜度卻可能是一樣的。比如:T(n)=n^2+2n+4 與 T(n)=4n2+n+8,他們的時間頻度顯然不一樣,但他們的時間複雜度卻是一樣的,均爲O(n2),時間複雜度只關注最高數量級,且與之係數也沒有關係。

三、最壞時間複雜度和平均時間複雜度

最壞時間複雜度:
最壞情況下的時間複雜度稱最壞時間複雜度,一般不特別說明,討論的時間複雜度均是最壞情況下的時間複雜度。這樣做的原因是:最壞情況下的時間複雜度是算法在任何輸入實例上運行時間的上界,這就保證了算法的運行時間不會比最壞時間複雜度更長。

平均時間複雜度:
平均時間複雜度是指所有可能的輸入實例均以等概率出現的情況下,算法的期望運行時間,設每種情況的出現的概率爲pi,平均時間複雜度則爲sum(pi*f(n)) 。

四、求解算法的時間複雜度的具體步驟

  1. 找出算法中的基本語句
    算法中執行次數最多的那條語句就是基本語句,通常是最內層循環的循環體。
  2. 計算基本語句的執行次數的數量級
    只需計算基本語句執行次數的數量級,這就意味着只要保證基本語句執行次數的函數中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能夠簡化算法分析,並且使注意力集中在最重要的一點上:增長率。
  3. 用大Ο記號表示算法的時間性能
    將基本語句執行次數的數量級放入大Ο記號中,如果算法中包含嵌套的循環,則基本語句通常是最內層的循環體;如果算法中包含並列的循環,則將並列循環的時間複雜度相加。

舉個簡單的例子:

for(i=1;i<=n;i++){
     a++
};
for(i=1;i<=n;i++){
     for(j=1;j<=n;j++){
           a++;
     }
}

第一個for循環的時間複雜度爲o(n),第二個for循環時間複雜度爲o(n^2),則整個算法的時間複雜度爲二者的和:
o(n^2+2)

o(1)表示基本語句的執行次數是一個常數,一般來說,只要算法中不存在循環語句,時間複雜度就爲o(1)。

五、常用時間複雜度

常用的時間複雜度有以下七種,算法時間複雜度依次增加:O(1)常數型、O(log2 n)對數型、O(n)線性型、O(nlog2n)二維型、O(n2)平方型、O(n3)立方型、O(2^n)指數型.

下圖表示隨問題規模n的增大,算法執行時間的增長率。
在這裏插入圖片描述

六、特殊時間複雜度

  1. 二分查找
    因爲每次的計算,都可以把查找的範圍縮小一半,所以二分查找的時間複雜度爲O(log2 N)。

  2. 斐波那契的遞歸算法
    因爲每次的展開都要把當前的已知項再拆分成當前數目的兩倍,所以斐波那契的遞歸算法時間複雜度爲2^N。

斐波那契的時間複雜度算法如下圖所示,計算n第N個斐波那契數的大小時,共需計算2^(N - 1)次。

在這裏插入圖片描述

七、常用排序算法的時間複雜度

在這裏插入圖片描述

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