P/NP问题
感覺挺有意思的東西,感覺果殼上的一篇文章解釋的超級棒;
原文鏈接:http://www.guokr.com/article/437662/
美劇《基本演繹法》(也就是美版“福爾摩斯”)第 2 季第 2 集中,兩位研究 NP 問題的數(shù)學(xué)家被謀殺了,兇手是同行,因為被害者即將證明“P=NP 問題”,她為獨吞成果而下了毒手。然而兇手的動機,并不是千禧年大獎難題那100萬美元的獎金——解決了 P=NP 問題,就能夠破譯世界上所有的密碼系統(tǒng),這里面的利益比100萬美元多多了。
劇中只用了一句話來介紹 P=NP 的意義:“能用電腦快速驗證一個解的問題,也能夠用電腦快速地求出解”。這句過于簡單的話可能讓大家一頭霧水,今天我們就來講一講 P vs.?NP。
什么是P和NP?
《基本演繹法》S02E02 截圖。
計算機科學(xué)的一個主要研究方向是提高各種算法的速度。尤其在當(dāng)前火熱的“大數(shù)據(jù)”概念下,算法速度更顯重要。很容易理解,處理的數(shù)據(jù)越大,計算的耗時就越多。對于一個算法,人們能夠分析出運算時間與數(shù)據(jù)量之間的大致函數(shù)關(guān)系,這個關(guān)系被稱為時間復(fù)雜度,它定量描述了該算法的運行時間。
假設(shè)有 n 個數(shù)要排序。一個初級的冒泡排序算法所需時間可能與 n2 成正比,快一點的算法所需時間與 nlog(n) 成正比。在某些條件下,桶排序算法所需時間甚至只和 n 成正比。最不實用的算法就是輸入的數(shù)字隨機排列,直到出現(xiàn)完全有序的情況為止……記前三個算法的時間復(fù)雜度分別記為 O(n2)、O(nlogn) 和 O(n),最后的“猴子排序”(Bogosort)算法平均時間復(fù)雜度則達到了 O(n*n!)。
在上面的例子中,前三種算法的復(fù)雜度是 n 的多項式函數(shù);最后一種算法的復(fù)雜度是 n 的階乘,根據(jù)斯特林公式,n! 相當(dāng)于指數(shù)級別的增長。當(dāng) n 特別小時,多項式級的算法已經(jīng)快過指數(shù)級的算法。當(dāng) n 非常大時,人類根本看不到指數(shù)級復(fù)雜度算法結(jié)束的那天。自然的,大家會對多項式級別的算法抱有好感,希望對每一個問題都能找到多項式級別的算法。問題是——每個問題都能找到想要的多項式級別的算法嗎?
在一個由問題構(gòu)成的集合中,如果每個問題都存在多項式級復(fù)雜度的算法,這個集合就是 P 類問題(Polynomial)。這意味著,即使面對大規(guī)模數(shù)據(jù),人們也能相對容易地得到一個解,比如將一組數(shù)排序。
“NP”的全稱為“Nondeterministic Polynomial”,而不是“Non-Polynomial”。NP 類問題指的是,能在多項式時間內(nèi)檢驗一個解是否正確的問題。比如我的機器上存有一個密碼文件,于是就能在多項式時間內(nèi)驗證另一個字符串文件是否等于這個密碼,所以“破譯密碼”是一個 NP 類問題。NP 類問題也等價為能在多項式時間內(nèi)猜出一個解的問題。這里的“猜”指的是如果有解,那每次都能在很多種可能的選擇中運氣極佳地選擇正確的一步。
不妨舉個例子:給出 n 個城市和兩兩之間的距離,求找到一個行走方案,使得到達每個城市一次的總路程最短。我們可以這樣來“猜測”它的解:先求一個總路程不超過 100 的方案,假設(shè)我們可以依靠極好的運氣“猜出”一個行走路線,使得總長度確實不超過 100,那么我們只需要每次猜一條路一共猜 n 次。接下來我們再找總長度不超過 50 的方案,找不到就將閾值提高到75…… 假設(shè)最后找到了總長度為 90 的方案,而找不到總長度小于 90 的方案。我們最終便在多項式時間內(nèi)“猜”到了這個旅行商問題的解是一個長度為 90 的路線。它是一個 NP 類的問題。
也就是說,NP 問題能在多項式時間內(nèi)“解決”,只不過需要好運氣。顯然,P 類問題肯定屬于 NP 類問題。所謂“P=NP”,就是問——是不是所有的 NP 問題,都能找到多項式時間的確定性算法?
P會不會等于NP?
《基本演繹法》S02E02 截圖。
這個問題目前還沒有定論,當(dāng)下學(xué)術(shù)界的大多數(shù)意見是 P≠NP。一個主要原因是,這么多年過去了,人們?nèi)匀粵]有找到解決上千個 NPC 問題中任何一個的多項式復(fù)雜度的算法。等等,NPC 又是什么?
在與數(shù)不盡的問題搏斗的過程中,人們有時候會發(fā)現(xiàn),解決問題 A 的算法可以同時用來解決問題 B。例如問題 A 是對學(xué)生的姓名與所屬班級同時排序,問題 B 是對人們按照姓名做排序。這時候,我們只需要讓班級全都相同,便能照搬問題 A 的算法來解決問題 B。這種情況下,數(shù)學(xué)家就說,問題 B 能歸約為問題 A。
人們發(fā)現(xiàn),不同的 NP 問題之間也會出現(xiàn)可歸約的關(guān)系,甚至存在這么一類(不只是一個)問題,使得任何其它的 NP 問題都能歸約到它們上。也就是說,能夠解決它們的算法就能夠解決所有其它的 NP 問題。這一類問題就是 NPC 問題。這樣的問題人們已經(jīng)找到了幾千個,如果我們給其中任何一個找到了多項式級別的算法,就相當(dāng)于證明了 P=NP。但是人們至今沒有成功找到,所以大家對 P=NP 的信心大打折扣。
解密無遮攔?
《基本演繹法》S02E02 截圖。
雖然前景很不樂觀,但是不妨來假想一下,如果 P=NP,《基本演繹法》中所說的“破解密碼只是小菜一碟”就會成真了嗎?
前面說過,證明 P=NP 的一個主要方法就是,給某一個 NPC 問題找到一個快速算法。但是,也不排除有人給出一個“存在性”而非“構(gòu)造性”的證明,只是告訴大家存在符合要求的算法,但沒法詳細描述出來。如果 P=NP 被人以這種方式證明出來了,我們也沒法依葫蘆畫瓢地把這個神奇的算法在電腦上寫出來,所以對破解密碼仍然沒有幫助。
退一步說,假如有人構(gòu)造出可以運用的多項式算法,以此證明了這個問題。這個算法恐怕也很復(fù)雜(畢竟這么難找),它的多項式級別的復(fù)雜度也可能會非常慢。假設(shè)這個算法的復(fù)雜度達到了 O(n10),那我們依然面臨著不小的麻煩。即使 n=100,運算時間也會增長到非常巨大的地步。
再退一步,假設(shè)人類的運氣好到 P=NP 是真的,并且找到了復(fù)雜度不超過 O(n3) 的算法。如果到了這一步,我們就會有一個算法,能夠很快算出某個帳號的密碼。《基本演繹法》里面所想象的可能就要成真了,所有的加密系統(tǒng)都會失去效果——應(yīng)該說,所有會把密碼變成數(shù)字信息的系統(tǒng)都會失去效果,因為這個數(shù)字串很容易被“金鑰匙”計算出來。
除此之外,我們需要擔(dān)心或期許的事情還有很多:
- 一大批耳熟能詳?shù)挠螒?#xff0c;如掃雷、俄羅斯方塊、超級瑪麗等,人們將為它們編寫出高效的AI,使得電腦玩游戲的水平無人能及。
- 整數(shù)規(guī)劃、旅行商問題等許多運籌學(xué)中的難題會被高效地解決,這個方向的研究將提升到前所未有的高度。
- 蛋白質(zhì)的折疊問題也是一個 NPC 問題,新的算法無疑是生物與醫(yī)學(xué)界的一個福音。
Wikipedia上有一個關(guān)于NPC問題的列表。如果我們手握解決NPC問題的金鑰匙,它們?nèi)寄鼙伙w快地解決。
除此之外,P=NP 最令人震撼的成果之一可能是下面這段話:
……(P=NP)會將數(shù)學(xué)轉(zhuǎn)變?yōu)樽層嬎銠C對任何問題尋找擁有合理長度的證明的學(xué)科,因為我們能夠在多項式時間內(nèi)驗證一個證明是否正確。這些問題也正好包括千禧年大獎的那些問題。
它出自 NP 完全理論奠基人史提芬·古克的筆下。上面這些只言片語的描述,已經(jīng)展現(xiàn)出了 P=NP情況下,世界將會出現(xiàn)怎樣一副天翻地覆的變化。也正是因為這樣的結(jié)果實在難以置信,人們普遍傾向于相信 P≠NP。我也希望 P≠NP ,這樣至少我的網(wǎng)銀相對來說還是挺安全的。
來自wiki的花絮;
話說Hubert Chen的玩笑我想了半天=, =
花絮[編輯]
普林斯頓大學(xué)計算機系樓將二進制代碼表述的“P=NP?”問題刻進頂樓西面的磚頭上。如果證明了P=NP,磚頭可以很方便的換成表示“P=NP!”。[2]
康奈爾大學(xué)的Hubert Chen博士提供了這個玩笑式的P不等于NP的證明:[3]
反證法。設(shè)P = NP。令y為一個P = NP的證明。證明y可以用一個合格的計算機科學(xué)家在多項式時間內(nèi)驗證,我們認定這樣的科學(xué)家的存在性為真。但是,因為P = NP,該證明y可以在多項式時間內(nèi)由這樣的科學(xué)家發(fā)現(xiàn)。但是這樣的發(fā)現(xiàn)還沒有發(fā)生(雖然這樣的科學(xué)家試圖發(fā)現(xiàn)這樣的一個證明),我們得到了矛盾。
以下是一個經(jīng)典證明:掃雷是NP完全問題
原文鏈接:
http://www.matrix67.com/blog/archives/544
曾經(jīng)看到過自動掃雷軟件,當(dāng)時我就在想,掃雷游戲是否有什么牛B的多項式算法。最近才看到,掃雷問題居然是一個NP完全問題,并且這個定理有一個簡單、直觀而又神奇的證明。在這里和大家分享一下整個證明過程。
????首先,掃雷一定是NP問題,它顯然可以在多項式的時間里驗證一個解。接下來,我們需要把一個已知的NP完全問題歸約到掃雷問題上去。我們將給出一種把邏輯電路問題歸約到掃雷問題的方法,這樣的話我們就可以利用掃雷問題解決邏輯電路問題,從而說明邏輯電路問題不比掃雷難。我們將把邏輯電路問題轉(zhuǎn)換成一種對應(yīng)的掃雷布局,就像畫畫一樣把邏輯電路畫在掃雷的棋盤上。如果你還不知道什么叫NP完全問題,什么叫邏輯電路問題,你可以看一看我的這篇文章。
???
????上圖就是一條帶有Boolean值的線路。注意到x和x’中有且僅有一個有雷。如果(沿線路方向)前一個格子有雷,我們就說這條線路狀態(tài)為True;反之如果后一個格子有雷,那么這條線路所傳遞的Boolean值就是False。每條線路的起始端都如下圖左所示,其中符號*表示該格里必然有雷,x和x’中同樣是有且僅有一個有雷,但到底是哪一個里面有雷誰也說不清楚。線路是可以拐彎的,如下圖右所示,這可以保證轉(zhuǎn)角后Boolean值相同。
???
?
????我們需要構(gòu)造一些特殊的掃雷布局來解釋NOT門、AND門和OR門。構(gòu)造NOT門最為簡單,下圖就是一個NOT門,注意經(jīng)過了中間的NOT門后,x和x’的位置互換,True變成了False,False也將變成True。
???
?
????AND門和OR門的構(gòu)造就比較復(fù)雜了。下面是AND門的構(gòu)造,U和V是輸入的兩條線路,T是輸出的線路。為了說明這確實是一個AND門,我們將說明:在下面的構(gòu)造中,如果線路T是True(即最右邊那個格子t有雷)的話,那么格子u和v必須都有雷才行。如果最右邊的格子t有雷,我們可以很快推斷出,圖中所有其它的t格都是有雷的,所有t’都是無雷的。觀察a3正上方的那個”3″,我們立即看出a2,a3都必須有雷,于是繼續(xù)推得a1無雷,s有雷。類似地,我們可以知道r也是有雷的。在中間一行的*4t處,4的上下左右都已經(jīng)有雷了,那么u’和v’必然無雷,于是繼續(xù)往左推得u和v都有雷。
???
?
????OR門的構(gòu)造比較類似,如下圖。如果r無雷的話,可知a2,a3有雷,a1無雷,s’有雷,進而s無雷。觀察”6″可知u’和v’都有雷,于是u和v均無雷。
???
?
????不斷套用這幾個邏輯門的構(gòu)造圖來連接電路,直到輸出線路只剩下唯一的一條。把最后的輸出線路從x或者x’處截斷(相當(dāng)于把最終輸出的Boolean值定下來)后,整個布局就成了一個“掃雷版SAT問題”了。
????最后還有一個容易忽略的問題:要是線路交叉了該咋辦?下圖的構(gòu)造可以保證線路交叉后仍不改變原線路所帶的Boolean值。至此,我們已經(jīng)可以把任一邏輯電路布局到掃雷棋盤上,解決這個掃雷問題就相當(dāng)于要解一個邏輯電路問題,因此掃雷問題至少和邏輯電路問題一樣難。
???
//話說華為的那題應(yīng)該是NPC問題,我看了下題目就卒了;
總結(jié)
- 上一篇: 【CSS3学习笔记】16:边框图片效果
- 下一篇: css代码 文字超出点点点