有時候,咱們要評估一個算法的複雜度,可是算法被分散爲幾個遞歸的子問題,這樣評估起來很難,有一個數學公式能夠很快地評估出來。算法
主方法,也能夠叫主定理。對於那些用分治法,有遞推關係式的算法,能夠很快求出其複雜度。segmentfault
定義以下:數組
若是對證實感興趣的能夠翻閱書籍:《算法導論》。若是以爲太難思考,能夠跳過該節。數據結構
因爲主定理的公式十分複雜,因此這裏有一種比較簡化的版原本計算:併發
O(1)
,遞推運算時間公式爲:T(n) = T(n/2) + O(1)
。O(n)
,遞推運算時間遞推公式爲:T(n) = 2T(n/2) + O(n)
。按照簡化版的主定理,能夠知道:數據結構和算法
二分查找:a = 1,b = 2,d = 0
,能夠知道a = b^d
,因此二分查找的時間複雜度爲:O(logn)
。函數
快速排序:a = 2,b = 2,d = 1
,能夠知道a = b^d
,因此快速排序的時間複雜度爲:O(nlogn)
。spa
強調:並不是全部遞推關係式均可應用主定理,可是大部分狀況下均可以。code
由於須要較多的數學知識,因此咱們只簡單介紹到這裏。協程
在計算機科學中,有一個專門的分支研究問題的可計算性,叫作計算理論。
咱們用計算機算法來解決一個問題,若是一個問題被證實很難計算,或者只能暴力枚舉來解決,那麼咱們就沒必要花大力氣去質疑使用的算法是否是錯了,爲何這麼慢,計算怎麼久都沒出結果,到底有沒有更好的算法。
計算機科學把一個待解決的問題分類爲:P
問題,NP
問題,NPC
問題,NP-hard
問題。
相似於O(1)
,O(logn)
,O(n)
等複雜度,規模n
出如今底數的位置,計算機能在多項式時間解決,咱們稱爲多項式級的複雜。
相似於O(n!)
,O(2^n)
等複雜度,規模n
出如今頂部的位置,計算機能在非多項式時間解決,咱們稱爲非多項式級的複雜度。
若是一個問題,能夠用一個算法在多項式時間內解決,它稱爲P
問題(P
爲Polynominal
的縮寫,多項式)。
好比求1加到100的總和,它的時間複雜度是O(n)
,是多項式時間。
然而有些問題,只能用枚舉的方式求解,時間複雜度是指數級別,非多項式時間,可是隻要有一個解,咱們能在多項式時間驗證這個解是對的,這類問題稱爲NP
問題。
也就是說,若是咱們只能靠猜出問題的一個解,而後能夠用多項式時間來驗證這個解,這些問題都是NP
問題。
因此,按照定義,全部的P
問題都是NP
問題。
計算理論延伸出了圖靈機理論,自動機=算法。
有兩種自動機,一種是肯定性自動機,機器從一個狀態到另一個狀態的變化,只有一個分支能夠走,而非肯定性自動機,從一個狀態到另一個狀態,有多個分支能夠走。P
問題均可以用兩種機器來解決,當非肯定性自動機退化就變成了肯定性自動機,而NP
問題只能用非肯定性自動機來解決。
自動機對N
和NP
問題的定義:
能夠在肯定性自動機以多項式時間解決的問題,稱爲P
問題,能夠在多項式時間驗證答案的問題稱爲NP
問題。而NP
問題是能夠在非肯定型自動機以多項式時間解決的問題(NP
兩字爲Non-deterministicPolynomial
的縮寫,非肯定多項式)。
數學,計算機科學,哲學,三個學科其實交融在一塊兒,自動機是一臺假想的機器,世界其實也能夠認爲是一個假想的機器,因此世界能夠等於一臺自動機嗎,你們能夠發揮想象力,在之後的日子裏慢慢體會,建議購買書籍《計算理論》補習相關知識。
存在這樣一個NP
問題,全部的NP
問題均可以約化成它。換句話說,只要解決了這個問題,那麼全部的NP
問題都解決了。其定義要知足2個條件:
NP
問題。NP
問題均可以約化到它。這種問題稱爲NP
徹底問題(NPC
)。按照這種定義,NP
問題要比NPC
問題的範圍廣。
那什麼是NP-hard
問題,其定義要知足2個條件:
NP
問題均可以約化到它。NP
問題。也就是說,NP-hard
問題更難,你只要解決了NP-hard
問題,那麼全部的NP
問題均可以解決。可是,這個問題自己不是一個NP
問題,也就是解不能在多項式時間內被驗證。
好比你有一個交際網,每一個人是一個節點,認識的人之間相連。你要經過一個最快、最省錢、最能提高你我的形象、最沒有威脅、最不影響你平常生活的方式認識一個萌妹,你怎麼證實你認識這個萌妹是最省錢的呢?-來自知乎回答。
咱們一旦發現一個問題是NPC
問題,那麼咱們很難去準確求出其解,只能暴力枚舉,靠猜。
各種問題能夠用這個圖來表示:
"P=NP
" 問題的目標,就是想要知道P
和NP
這兩個集合是否相等。爲了證實兩個集合(A
和B
)相等,通常都要證實兩個方向:
A
包含B
。B
包含A
。咱們已經說過NP
包含了P
。由於任何一個非肯定性機器,都能被當成一個肯定性的機器來用。你只要不使用它的「超能力」,在每一個分支點只探索一條路徑就行。
因此 "P=NP
" 就在於P
是否也包含了NP
。也就是說,若是隻使用肯定性計算機,可否在多項式時間以內,解決全部非肯定性計算機能在多項式時間內解決的問題。
我是陳星星,歡迎閱讀我親自寫的 數據結構和算法(Golang實現),文章首發於 閱讀更友好的GitBook。