NP問題

網易被鄙視以後,找了一點NP問題的資料,學習一下:)

首先說明一下問題的複雜性和算法的複雜性的區別,下面只考慮時間複雜性。算法的複雜性是指解決問題的一個具體的算法的執行時間,這是算法的性質;問題的複雜性是指這個問題本身的複雜程度,是問題的性質。比如對於排序問題,如果我們只能通過元素間的相互比較來確定元素間的相互位置,而沒有其他的附加可用信息,則排序問題的複雜性是O(nlgn),但是排序算法有很多,冒泡法是O(n^2),快速排序平均情況下是O(nlgn)等等,排序問題的複雜性是指在所有的解決該問題的算法中最好算法的複雜性。問題的複雜性不可能通過枚舉各種可能算法來得到,一般都是預先估計一個值,然後從理論上證明。
爲了研究問題的複雜性,我們必須將問題抽象,爲了簡化問題,我們只考慮一類簡單的問題,判定性問題,即提出一個問題,只需要回答yes或者no的問題。任何一般的最優化問題都可以轉化爲一系列判定性問題,比如求圖中從A到B的最短路徑,可以轉化成:從A到B是否有長度爲1的路徑?從A到B是否有長度爲2的路徑?。。。從A到B是否有長度爲k的路徑?如果問到了k的時候回答了yes,則停止發問,我們可以說從A到B的最短路徑就是k。如果一個判定性問題的複雜度是該問題的一個實例的規模n的多項式函數,則我們說這種可以在多項式時間內解決的判定性問題屬於P類問題。P類問題就是所有複雜度爲多項式時間的問題的集合。然而有些問題很難找到多項式時間的算法(或許根本不存在),比如找出無向圖中的哈米爾頓迴路問題,但是我們發現如果給了我們該問題的一個答案,我們可以在多項式時間內判斷這個答案是否正確。比如說對於哈米爾頓迴路問題,給一個任意的迴路,我們很容易判斷他是否是哈米爾頓迴路(只要看是不是所有的頂點都在迴路中就可以了)。這種可以在多項式時間內驗證一個解是否正確的問題稱爲NP問題。顯然,所有的P類問題都是屬於NP問題的,但是現在的問題是,P是否等於NP?這個問題至今還未解決。注意,NP問題不一定都是難解的問題,比如簡單的數組排序問題是P類問題,但是P屬於NP,所以也是NP問題,你能說他很難解麼?剛纔說了,現在還不知道是否有P=NP或者P<>NP,但是後來人們發現還有一系列的特殊NP問題,這類問題的特殊性質使得很多人相信P<>NP,只不過現在還無法證明。這類特殊的NP問題就是NP完全問題(NPC問題,C代表complete)。NPC問題存在着一個令人驚訝的性質,即如果一個NPC問題存在多項式時間的算法,則所有的NP問題都可以在多項式時間內求解,即P=NP成立!!這是因爲,每一個NPC問題可以在多項式時間內轉化成任何一個NP問題。比如前面說的哈米爾頓迴路問題就是一個NPC問題。NPC問題的歷史並不久,cook在1971年找到了第一個NPC問題,此後人們又陸續發現很多NPC問題,現在可能已經有3000多個了。所以,我們一般認爲NPC問題是難解的問題,因爲他不太可能存在一個多項式時間的算法(如果存在則所有的NP問題都存在多項式時間算法,這太不可思議了,但是也不是不可能)。類似哈米爾頓迴路/路徑問題,貨郎擔問題,集團問題,最小邊覆蓋問題(注意和路徑覆蓋的區別),等等很多問題都是NPC問題,所以都是難解的問題。

旅行售貨員問題描述:

某售貨員要到若干城市去推銷商品,已知個城市之間的路徑(或旅費),他要選定一條從駐地出發,經過每個城市一遍,最後回到駐地的路線,使總的路程(或總旅費)最小。

發佈了98 篇原創文章 · 獲贊 23 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章