數據結構和算法(Golang實現)(10)基礎知識-算法複雜度主方法

算法複雜度主方法

有時候,咱們要評估一個算法的複雜度,可是算法被分散爲幾個遞歸的子問題,這樣評估起來很難,有一個數學公式能夠很快地評估出來。算法

1、複雜度主方法

主方法,也能夠叫主定理。對於那些用分治法,有遞推關係式的算法,能夠很快求出其複雜度。segmentfault

定義以下:數組

若是對證實感興趣的能夠翻閱書籍:《算法導論》。若是以爲太難思考,能夠跳過該節。數據結構

因爲主定理的公式十分複雜,因此這裏有一種比較簡化的版原本計算:併發

2、舉例

  1. 二分搜索,每次問題規模減半,只查一個數,遞推過程以外的查找複雜度爲O(1),遞推運算時間公式爲:T(n) = T(n/2) + O(1)
  2. 快速排序,每次隨機選一個數字做爲劃分進行排序,每次問題規模減半,遞推過程以外的排序複雜度爲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問題

在計算機科學中,有一個專門的分支研究問題的可計算性,叫作計算理論。

咱們用計算機算法來解決一個問題,若是一個問題被證實很難計算,或者只能暴力枚舉來解決,那麼咱們就沒必要花大力氣去質疑使用的算法是否是錯了,爲何這麼慢,計算怎麼久都沒出結果,到底有沒有更好的算法。

計算機科學把一個待解決的問題分類爲:P問題,NP問題,NPC問題,NP-hard問題。

1、P 和 NP 問題

相似於O(1)O(logn)O(n)等複雜度,規模n出如今底數的位置,計算機能在多項式時間解決,咱們稱爲多項式級的複雜。

相似於O(n!)O(2^n)等複雜度,規模n出如今頂部的位置,計算機能在非多項式時間解決,咱們稱爲非多項式級的複雜度。

若是一個問題,能夠用一個算法在多項式時間內解決,它稱爲P問題(PPolynominal的縮寫,多項式)。

好比求1加到100的總和,它的時間複雜度是O(n),是多項式時間。

然而有些問題,只能用枚舉的方式求解,時間複雜度是指數級別,非多項式時間,可是隻要有一個解,咱們能在多項式時間驗證這個解是對的,這類問題稱爲NP問題。

也就是說,若是咱們只能靠猜出問題的一個解,而後能夠用多項式時間來驗證這個解,這些問題都是NP問題。

因此,按照定義,全部的P問題都是NP問題。

計算理論延伸出了圖靈機理論,自動機=算法。

有兩種自動機,一種是肯定性自動機,機器從一個狀態到另一個狀態的變化,只有一個分支能夠走,而非肯定性自動機,從一個狀態到另一個狀態,有多個分支能夠走。P問題均可以用兩種機器來解決,當非肯定性自動機退化就變成了肯定性自動機,而NP問題只能用非肯定性自動機來解決。

自動機對NNP問題的定義:

能夠在肯定性自動機以多項式時間解決的問題,稱爲P問題,能夠在多項式時間驗證答案的問題稱爲NP問題。而NP問題是能夠在非肯定型自動機以多項式時間解決的問題(NP兩字爲Non-deterministicPolynomial的縮寫,非肯定多項式)。

數學,計算機科學,哲學,三個學科其實交融在一塊兒,自動機是一臺假想的機器,世界其實也能夠認爲是一個假想的機器,因此世界能夠等於一臺自動機嗎,你們能夠發揮想象力,在之後的日子裏慢慢體會,建議購買書籍《計算理論》補習相關知識。

2、NPC 和 NP-hard 問題

存在這樣一個NP問題,全部的NP問題均可以約化成它。換句話說,只要解決了這個問題,那麼全部的NP問題都解決了。其定義要知足2個條件:

  1. 它得是一個NP問題。
  2. 全部的NP問題均可以約化到它。

這種問題稱爲NP徹底問題(NPC)。按照這種定義,NP問題要比NPC問題的範圍廣。

那什麼是NP-hard問題,其定義要知足2個條件:

  1. 全部的NP問題均可以約化到它。
  2. 它不是一個NP問題。

也就是說,NP-hard問題更難,你只要解決了NP-hard問題,那麼全部的NP問題均可以解決。可是,這個問題自己不是一個NP問題,也就是解不能在多項式時間內被驗證。

好比你有一個交際網,每一個人是一個節點,認識的人之間相連。你要經過一個最快、最省錢、最能提高你我的形象、最沒有威脅、最不影響你平常生活的方式認識一個萌妹,你怎麼證實你認識這個萌妹是最省錢的呢?-來自知乎回答。

咱們一旦發現一個問題是NPC問題,那麼咱們很難去準確求出其解,只能暴力枚舉,靠猜。

3、總結

各種問題能夠用這個圖來表示:

"P=NP" 問題的目標,就是想要知道PNP這兩個集合是否相等。爲了證實兩個集合(AB)相等,通常都要證實兩個方向:

  1. A包含B
  2. B包含A

咱們已經說過NP包含了P。由於任何一個非肯定性機器,都能被當成一個肯定性的機器來用。你只要不使用它的「超能力」,在每一個分支點只探索一條路徑就行。

因此 "P=NP" 就在於P是否也包含了NP。也就是說,若是隻使用肯定性計算機,可否在多項式時間以內,解決全部非肯定性計算機能在多項式時間內解決的問題。

系列文章入口

我是陳星星,歡迎閱讀我親自寫的 數據結構和算法(Golang實現),文章首發於 閱讀更友好的GitBook

相關文章
相關標籤/搜索