挑戰408——數據結構(6)——標準複雜類

合併算法的算法複雜度

上一篇,我們可以通過分治法實現了排序功能,現在我們來分析一下它的算法複雜度。按照以前的分析方式,調用合併排序算法來對一組含N個數的vector進行排序的時候,運行時間可以分爲下面兩個部分:

  1. 執行非遞歸調用所需要的的時間。
  2. 執行遞歸調用所需要的的時間。

我們先看非遞歸調用的時間,在遞歸調用sort函數之前,我們需要對N個vector中的數據進行分解,然後將分解的數據填充到兩個小vector中,這個過程需要循環執行N輪。同樣,合併填充的操作也跟當初分解填充是一樣的。於是實際的非遞歸操作次數爲 O(2N),忽略常數也就是O(N)
那麼遞歸調用所用的時間呢?要排序大小爲N的vector,我們就必須遞歸排序大小爲N / 2的兩個vector。這些排序操作中的每一個都需要相同的時間。相同的邏輯,這些較小向量中的每一個進行排序需要與該級別的N / 2成正比,再加上其自身遞歸調用所需的時間,這個過程將一直持續到達到simple case(vector由單個元素組成或根本沒有元素)。
解決問題所需的總時間就是每個級別中遞歸分解所需時間的總和。用回上篇的例子,這裏分解一下遞歸分解的過程:
在這裏插入圖片描述
當我們向下遞歸分解時,vector雖然變小,但變得更多。但是,在每個層次上所做的工作總是與N成正比。因此,確定總工作量是一個發現有多少級別的問題。(即能分多少層就可以到達simple Case)。
上圖可以看到,每一層的值都是上一層中的值除以所得,因此在vector大小被分到1之前,總層數 = N能被2除的次數,換成數學語言就是,找到這樣的一個k,使得
在這裏插入圖片描述
成立即可。顯然:
在這裏插入圖片描述
因爲N可以分成k層,且每一層要完成的總操作數(執行次數)都是N,所以總的執行次數N log2N。對數通常以10(常用對數)或數學常數e(自然對數)的冪表示,但是與其他科學學科不同,計算機科學傾向於使用基於2的冪的二進制對數。因爲使用不同的冪計算的對數 基數只有一個常數因子不同,因此在討論計算複雜度時,我們通常省略對數基數。 因此,合併排序的計算複雜度通常寫爲:
在這裏插入圖片描述

比較N^2 和N log2N的性能

但是O(N log N)有多好? 我們查看一下實驗數據,瞭解一下選擇和合並排序算法的運行時間如何。 該時序信息如下圖所示:

在這裏插入圖片描述
對於10個項目,合併排序的這種實現比選擇排序慢五倍多。 在100個項目,選擇排序仍然更快,但快的不是那麼明顯了。 當輸入100,000個項目時,合併排序比選擇排序快幾百倍,選擇排序算法需要兩分半鐘以上的時間來排序100,000個項目,而合併排序在不到半秒鐘內完成作業。對於大型vector,合併排序顯然是一個對大數據排序的顯著的改進。
另外,我們還可以通過比較兩種算法的計算複雜度公式獲得相同的信息,如下所示:
在這裏插入圖片描述
我們可以獲得相同的信息: 隨着N變大,兩列中的數字都在增長,但N平方列的增長速度比N*log N列快得多。 因此,基於N log N算法的排序算法對於更大範圍的vector是很有效果的。

標準複雜類

在編程中,大多數算法屬於幾種常見的複雜類。最重要的複雜性類別下表所示,它給出了類的通用名稱以及相應的big-O表達式和該類中的代表性算法:

在這裏插入圖片描述
因爲N的值會逐漸變大。下圖顯示了以對數刻度繪製的相同數據,可以更好地瞭解這些函數隨着N增大時,複雜度的增長趨勢:
當N很小的時候
在這裏插入圖片描述
當N很大的時候

在這裏插入圖片描述
屬於常數,線性,二次和立方複雜度類以及其他更爲一般的算法都是一般稱爲多項式算法(polynomial algorithms)。它們都在時間N的k次方中執行(k是常數)。從圖中可以看出,隨着N值的增加,函數N^k 無論k多大,都始終比 2的N次方漲的更慢。
這個屬性在找到解決現實問題的實際算法方面具有重要的意義。比如選擇排序示例清楚地表明,二次算法對於N的值變大也具有實質的解決方式(如我們的分開再合併),但是其複雜度爲O(2^N)的算法都相當差。作爲一般的經驗法則,計算機科學家將可以通過多項式時間運算的算法解決的問題分類爲易於解決的問題(intractable),因爲它們可以在計算機上實現。沒有多項式時間算法存在的問題都被認爲是困難的(intractable)(比如2的N次方一類)。
然而,許多商業上重要的問題,所有已知算法都需要指數時間。比如我們學離散數學中,學習圖的時候的郵遞員問題(尋求找到一個可以通過一些交通系統連接的一組N個城市的最短路線,然後回到起點)。這些問題最有效的解決方案是嘗試所有可能性,這當然需要指數時間。但是另一方面,沒有人能夠最終證明不存在這個問題的多項式時間算法。可能會有一些聰明的算法使這些問題易於處理。如果真的是這樣,那麼目前認爲很困難的許多問題也將進入易處理的範圍。
像郵遞員這一類的問題,我們將它稱爲NP-完全問題(* NP-complete problems*),是否可以在多項式時間內解決問題是計算機科學中最重要的開放性問題之一,同樣這也疏於數學領域的問題。

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