- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
NP完全問題*1.引言在前面的各章中,我們對一些演算法的設計和分析進行了討論,這些演算法的運行時間可用低次多項式來表示(例二次)。在這一章,我們將注意力集中在這樣一類問題,這些問題至今沒有找到有效演算法,而且今後也有可能證明得知:它們無有效演算法。設П是任意問題,如果對問題存在一個演算法,它的時間複雜性是O(nk),其中n是輸入大小,k是非負整數,我們說問題П存在多項式時間演算法。現實世界的許多問題並不屬於這個範疇,因為求解這些問題需用指數(2n)或超指數(n!)來表示。*本章將研究難解問題的一個子類,通常稱為NP完全問題(NPC問題)。這一類問題目前約有3000多個,其中還包括數百個著名問題。它們有一個共同特性,如果它們中的一個是多項式可解的話,那麼所有其他問題也是多項式可解的。現存的求解這些問題演算法的運行時間,對於中等大小的輸入也要用幾百或幾千年的時間。易求解問題: 存在多項式時間演算法。難解問題: (到目前為止)不存在多項式時間演算法。*2.判定問題為了研究問題的複雜性,我們必須將問題抽象。為了簡化問題,我們只考慮一類簡單的問題,稱為“判定性問題”。也就是說提出一個問題,只需要回答Yes/No的問題。任何一般的最優化問題都可以轉化為一系列判定性問題。例如求圖中從A到B的最短路徑,該問題可以轉化成如下形式: 從A到B是否有長度為1的最短路徑? No 從A到B是否有長度為2的最短路徑? No …………………? No 從A到B是否有長度為k-1的最短路徑? No 從A到B是否有長度為k的最短路徑? Yes如果問到了k的時候,回答了Yes,則停止發問。我們可以說:從A到B的最短路徑長度為k。*3.確定性演算法定義10.1(P176)設A是求解問題П的一個演算法。如果在展示問題П的一個實例時,在整個執行過程中每一步都只有一種選擇,則稱A是確定性演算法。所以對於同樣的輸入,實例一遍又一遍地執行,它的輸出從不改變。在前面各章所討論的所有演算法都是確定性的。例1:演算法運算式的計算(5+3*8-9)例2:選擇排序法問題:哈密頓回路給出一個無向圖G=(V,E),它有哈密頓回路嗎?即在圖中是否存在一條恰好訪問每個頂點一次的回路。可以用窮舉法來求解,一條回路一條回路檢查下去,最終便能得到結果。但是窮舉法的演算法複雜性是指數級的,計算時間隨問題規模成指數型增長,很快就變得不可計算了,所以確定性演算法對此類問題無效。*4.P類定義10.2(P176)判定問題的P類由這樣的判定問題組成,它們的Yes/No解可以用確定性演算法在多項式時間內得到。例如在O(nk)內得到,其中k是非負整數,n是輸入實例的大小。例1:給出一個有n個整數的表,它們是否按降序排列?答:只要檢查表中相鄰二個數即可,運行時間為O(n)。例2:給出二個整數集合,它們的交集是否為空?答:因集合中無重複元素,先將所有整數排序,然後檢查相鄰二數是否相等,顯然運行時間為O(nlog2n)。*5.非確定性演算法有些計算問題是確定性的,例如“加減乘除”,你只要按照公式推導,按部就班一步步進行,就可以得到結果。但是有些問題無法按部就班直接進行計算的,例如“找大質數”的問題。已知目前最大質數,那麼下一個大質數應該是多少呢?有沒有一個公式可以一步步推算出來,顯然這樣的公式是沒有的。這種問題的答案,是無法直接計算得到的,只能通過“猜算”來得到結果,這也就是非確定性問題。這些問題通常有個演算法,它不能直接告訴你答案是什麼,但可以告訴你,某個可能的結果是正確的答案、還是錯誤的。這個可以告訴你“猜算”的答案正確與否的演算法,稱為非確定性演算法。假如“猜算”可以在多項式時間內得到,那麼該問題稱作“多項式非確定性問題”。*非確定性演算法定義(P177)對於輸入x,一個不確定演算法由猜測和驗證二個階段組成。⑴猜測階段在這個階段產生一個任意字串y,它可能是對應輸入實例x的一個解,也可能不是一個解,甚至不是解的合適形式,也可能在不確定演算法的不同次運行中不同。在此階段,僅僅要求在多項式時間內(O(ni),n=|x|)產生串y。對於許多問題,這個階段可以線上性時間內完成。⑵驗證階段檢查產生串y是否是解的合適形式,若不是,則演算法停下來回答No。若產生串y是解的合適形式,則繼續檢查y是否是問題實例x的解。若是,則演算法停下來回答Yes;若不是,則演算法停下來回答No。在此階段,也要求在多項式時間內(O(nj))完成。非確定
文档评论(0)