什么是计算机科学中的NP-complete?


429

什么是NP完全问题?为什么它在计算机科学中如此重要?


5
:你可能有兴趣在这个问题的答案stackoverflow.com/questions/111307/...
达恩·戴尔

1
好吧,我决定编写自己的答案,因为我不喜欢所接受答案的呈现方式,并且包括指向P = NP问题的链接。
grom

1
关于离散数学,有一个很好的arsdigita讲座,它解释了什么是NP完全问题。前50分钟主要是布尔代数。因此,如果您仅对P,NP,NP完备性,布尔可满足性问题和约简的概念感兴趣,请跳至第53分钟的开头。
davitenio,2009年

1
我们永远不会知道,因为使用大n它将永远不会完成;)
Pete Alvin 2014年

1
我非常喜欢,真的建议您查看以下视频说明:youtube.com/watch?
v=YX40hbAHx3s

Answers:


209

NP代表非确定性多项式时间。

这意味着可以使用非确定性图灵机(类似于常规图灵机,但还包括非确定性“选择”功能)在多项式时间内解决问题。基本上,解决方案必须可以在聚合时间内进行测试。如果是这样,并且可以使用输入经过修改的给定问题来解决已知的NP问题(可以将NP问题简化为给定问题),那么该问题就是NP完整的。

要摆脱NP完全问题,最主要的事情是它不能以任何已知的方式在多项式时间内求解。NP-Hard / NP-Complete是一种显示某些类型的问题在现实中无法解决的方法。

编辑:正如其他人指出的那样,通常有近似的解决方案来解决NP-完全问题。在这种情况下,近似解通常使用特殊的符号给出近似边界,该近似符告诉我们近似的接近程度。


2
“ ... NP问题可以简化为给定问题...”-简化的一个重要约束是确定性多项式。
拉法尔Dowgird

2
O()表示法是一种普遍使用的数学表示法:确实为O()的准确性提供了近似算法
Ying Xiao,

1
为了澄清一点,NP问题是指不确定的图灵机。在确定性的图灵机上能否在多项式时间内解决NP完全问题仍然未知。
rjzii

1
@Yuval:讲清楚一点。您以前的情况是完全错误的(除非P = NP)。从您的评论中,我感觉到您认为两个版本都是正确的。如果没有,我深表歉意。

33
这个答案远非完整和可以理解的,我不明白为什么会有如此多的反对。
nbro 2015年

428

什么是NP

NP是所有决策问题(具有“是或否”答案的问题)的集合,可以在多项式时间(O(n k)中验证 “是”答案,其中n是问题大小,而k是常数)由确定性图灵机。多项式时间有时被用作快速快速的定义。

什么是P

P是一套可以决定所有问题解决多项式时间确定性图灵机。由于它们可以在多项式时间内求解,因此它们也可以在多项式时间内验证。因此,P是NP的子集。

什么是NP-Complete

当且仅当 NP中的所有其他问题都可以快速(即在多项式时间内)转化为x时,NP中的问题x才在NP-Complete中。

换一种说法:

  1. x在NP中,并且
  2. NP中的每个问题都可以简化为x

因此,使NP-Complete如此有趣的是,如果要快速解决NP-Complete中的任何一个问题,那么所有NP问题都可以很快得到解决。

另请参阅文章“ P = NP?”,为什么它是一个如此著名的问题?

什么是NP-Hard

NP-Hard是至少与NP中最难的问题一样困难的问题。请注意,NP完全问题也是NP难问题。但是,尽管有NP前缀,但并非所有NP难题都是NP(甚至是决策问题)。那就是NP-hard中的NP并不意味着不确定的多项式时间。是的,这很令人困惑,但是其用法根深蒂固,不太可能改变。


4
“这就是NP-hard中的NP并不意味着非多项式” <-NP-complete(或其他任何地方)中的NP也不意味着非多项式。
sepp2k 2010年

1
感谢sepp2k的更正。我的意思是说这并不意味着NP(即不确定的多项式时间)。
grom 2010年

1
我认为您的答案比该主题中的其他内容简化了更多或更多。但这对我来说仍然是一个非常棘手的问题。。。猜测这就是为什么他们要付给算法专家高价的原因。
SoftwareSavant

3
关于NP:我认为应该是:该问题可以通过不确定的图灵机来解决。(不确定性而不是确定性)
2012年

2
@hqt我写的是正确的。注意单词“ verified”。您也是正确的,NP可以通过不确定的图灵机在多项式时间内求解
grom 2012年

32

NP-Complete的意思很具体,您必须小心,否则定义将会错误。首先,NP问题是是/否问题,因此

  1. 对于具有“是”答案的问题的每个实例,都有多项式时间证明,即答案为“是”,或者(等效地)
  2. 存在一个多项式时间算法(可能使用随机变量),如果问题实例的答案为“是”,则答案为“是”的可能性为非零,并且在以下情况下会100%表示“否”:答案是不。” 换句话说,该算法的假阴性率必须小于100%,并且没有假阳性。

如果X是NP-Complete

  1. X在NP中,并且
  2. 对于NP中的任何问题Y,都有一个从Y到X的“约简”:一种多项式时间算法,它将Y的任何实例转换为X的实例,这样,当且仅当Y实例的答案为“是”时,如果答案X实例为“是”。

如果X是NP完全的,并且存在确定性的多项式时间算法,可以正确解决X的所有实例(0%假阳性,0%假阴性),则NP中的任何问题都可以通过确定性多项式求解。时间(减少到X)。

到目前为止,还没有人提出这样一种确定性的多项式时间算法,但是没有人证明不存在这种算法(任何人都可以做到一百万美元:P = NP问题)。这并不意味着您无法解决NP-Complete(或NP-Hard)问题的特定实例。这只是意味着您无法像在可靠地对整数列表进行排序一样,无法在所有问题实例上可靠地工作。您可能会非常想出一种算法,该算法将在NP-Hard问题的所有实际情况下都能很好地工作。


1
我不喜欢吹牛,但我为我证明的确定性多项式时间算法感到非常自豪。;)
凯尔·克罗宁

20
我发现了一个真正的绝妙证据,该评论太狭窄而无法包含;)
quick_dry

条件2是P =ΔNP的陈述,而不是NP完整性的标准定义。应该是:存在确定性的多重时间算法,可以将任何其他 NP实例X转换为该问题的实例Y,并且仅当X的答案为“是”时,Y的答案为“是”。
克里斯·康威,

“您必须小心,否则您将得到错误的定义”-答案就是如此。这个答案部分正确,但是肯定不应该被接受。
Windows程序员

29

基本上,这个世界的问题可以归类为

         1)无法解决的问题2)棘手的问题3)NP问题4)P问题


         1)第一个是没有解决问题的方法。2)第二个是需要指数时间(即上面的O(2 ^ n))。3)第三个称为NP。4)第四是容易的问题。


P:指多项式时间问题的解决方案。

NP:参考多项式时间尚未找到解决方案。我们不确定是否没有多项式时间解决方案,但是一旦提供了解决方案,就可以在多项式时间中验证该解决方案。

NP完整:在多项式时间中仍未找到解决方案,但可以在多项式时间中进行验证。NP中的NPC问题是更困难的问题,因此,如果我们可以证明对NPC问题具有P解,那么可以在P解中找到NP问题。

NP Hard:参考“多项式时间”尚未找到解决方案,但确定无法在“多项式时间”中进行验证。NP困难问题超过了NPC困难。


很高兴看到这个答案,分类部分对于整个概念都很有表现力。我认为可交互的问题是NP问题。
PeerNet '19

22

NP-Complete是一类问题。

该类P由可在多项式时间内解决的问题组成。例如,它们可以在O(n k)中求解某个常数k,其中n是输入的大小。简而言之,您可以编写一个可以在合理的时间运行的程序。

该类NP包含在多项式时间内验证的那些问题。也就是说,如果给定了一个潜在的解,那么我们可以检查给定的解在多项式时间内是否正确。

一些示例是布尔可满足性(或SAT)问题或哈密顿循环问题。已知在NP类中存在许多问题。

NP-Complete意味着问题至少与NP中的任何问题一样困难。

这对计算机科学非常重要,因为已经证明,NP中的任何问题都可以转化为NP-complete中的另一个问题。这意味着对任何一个NP完全问题的解决方案就是对所有NP问题的解决方案。

安全性中的许多算法取决于以下事实:不存在针对NP难题的已知解决方案。如果找到解决方案,那肯定会对计算产生重大影响。


这是错误的。NP中的问题可以转化为NP完全中的任何问题,而不是NP中的任何问题。那是很大的不同。
David Nehme

此外,“问题和NP中的任何问题一样困难” —是的,但是更好的措词应该是“至少同样困难”。总的来说,这个答案比我所见过的任何其他答案都更接近,也比不幸地被接受的答案更接近。
Windows程序员

感谢您的观察。我已经更新了答案,包括您的更正。
文森特·拉姆丹妮

1
您对NP-完全的定义还不完整,还需要指定NP-完全问题也是NP(和NP-hard)问题,而不是像任何NP问题一样难。我将投票,如果您决定更改,请告知我,然后我删除投票。
nbro

20

这是一类问题,我们必须模拟所有可能性以确保我们拥有最佳解决方案。

对于某些NP完全问题,有很多很好的启发式方法,但充其量只是一种有根据的猜测。


差不多了 一个问题可以有一个非穷举的解决方案,但本质上仍然不是多项式的。
Mark Bessey

1
尽管不完全正确,但对于实际使用来说已经足够接近了。尽管OP可能需要pedantic定义,但pedantic定义不是必需的。这是一个很好的近似值!
doug65536

18

如果您正在寻找NP完全问题的示例,那么我建议您看一下3-SAT

基本前提是您有一个合取范式形式的表达式,这是一种表示您有一系列由OR组成的表达式的声明,所有条件都必须为真:

(a or b) and (b or !c) and (d or !e or f) ...

3-SAT问题是要找到一个满足该表达式的解决方案,其中每个OR表达式都具有恰好匹配的3个布尔值:

(a or !b or !c) and (!a or b or !d) and (b or !c or d) ...

一个解决方案可能是(a = T,b = T,c = F,d = F)。但是,尚未发现在多项式时间内一般情况下可以解决此问题的算法。这意味着解决此问题的最佳方法实质上是进行蛮力猜测和检查并尝试不同的组合,直到找到可行的组合为止。

3-SAT问题的特殊之处在于,任何NP完全问题都可以简化为3-SAT问题。这意味着,如果您能找到一个多项式时间算法来解决该问题,那么您将获得1,000,000美元,更不用说全世界计算机科学家和数学家的尊重和钦佩。


也许我对这里的其他解释感到困惑,但不应读为“在多项式时间内任何NP问题都可以简化为3-SAT问题”。因为这不是使3-SAT NP完成的原因吗?
DubiousPusher

@DubiousPusher不。答案正确地指出了这一点。此图像使它
变得清晰

14

老实说,维基百科可能是寻找答案的最佳场所。

如果NP = P,那么我们可以比以前想象的更快地解决非常棘手的问题。如果我们仅在P(多项式)时间内解决一个NP-完全问题,则可以将其应用于NP-完全类别中的所有其他问题。


6
“如果NP = P,那么我们可以比以前想象的更快地解决非常棘手的问题。” - 不。如果NP = P,则存在解决方案(存在确定性算法可以解决它们),但不能保证我们会知道它们是什么。
Windows程序员

一个公平的观点。我的猜测是任何证明P = NP可能具有建设性的证据(例如,发布了3-SAT多项式算法)。
克里斯·康威

10

我们需要分离算法和问题。我们编写算法来解决问题,并且它们以某种方式扩展。尽管这只是一种简化,但如果缩放比例足够好,我们就用“ P”标记算法,否则就用“ NP”标记。

了解有关我们要解决的问题的信息,而不是了解用于解决这些问题的算法,将很有帮助。因此,我们将说所有具有良好缩放算法的问题都是“ in P”。缩放算法较差的是“ in NP”。

这意味着很多简单的问题也“在NP中”,因为我们可以编写糟糕的算法来解决简单的问题。最好知道NP中的哪些问题确实很棘手,但我们不只是要说“这是我们没有找到好的算法的问题”。毕竟,我可能会提出一个我认为需要超级惊人算法的问题(称为X)。我告诉全世界,我想出的最佳算法很难解决X缩放问题,因此我认为X是一个非常棘手的问题。但是明天,也许比我更聪明的人发明了一种解决X并在P中的算法。因此,这并不是对难题的很好定义。

一样,NP中有很多问题,没有人知道一个好的算法。因此,如果我可以证明 X是某种问题:一个可以解决X的好的算法,可以通过某种round回方式,为NP中的其他每个问题提供一个好的算法。现在,人们可能会更加相信X是一个真正棘手的问题。在这种情况下,我们将其称为X NP-Complete。


5

上面关于NP完全问题的定义是正确的,但是我认为我可能会对它们的哲学重要性加些抒情,因为还没有人解决这个问题。

几乎所有您遇到的复杂问题都是NP Complete。这个类有一个非常基础的东西,在计算上似乎与容易解决的问题有所不同。它们有点自己的风味,识别它们并不难。从根本上讲,这意味着您无法完全解决任何中等复杂的算法-计划,优化,打包,覆盖等。

但是,如果您遇到的问题是NP Complete,并不是所有的一切都会丢失。人们在广泛的技术领域中研究近似算法,这将为您提供接近NP完全问题的解决方案的保证。其中一些是非常强大的保证-例如,对于3sat,您可以通过一个非常明显的算法获得7/8保证。甚至更好的是,实际上,有一些非常强大的启发式方法,可以很好地为这些问题提供很好的答案(但不能保证!)。

请注意,两个非常著名的问题-图形同构和分解-都不是P或NP。


5

我听过一个解释,那就是:“ NP完全性可能是算法研究中比较神秘的想法之一。“ NP”代表“不确定性多项式时间”,并且是所谓的“复杂性类别”的名称。NP复杂度类别的重要之处在于可以验证该类别中的问题通过多项式时间算法 例如,考虑计数的问题。假设桌子上有一堆苹果。问题是“那里有多少个苹果?” 系统会为您提供一个可能的答案8。您可以通过使用对苹果计数的算法,在多项式时间内验证该答案。对苹果进行计数的时间为O(n)(表示为Big-oh),因为对每个苹果进行计数需要一步。对于n个苹果,您需要n个步骤。这个问题在NP复杂度类别中。

如果可以证明问题是NP-Hard在多项式时间内验证的,则将其分类为NP-complete。在不深入讨论NP-Hard的情况下,可以说还没有发现多项式时间解的某些问题。也就是说,它需要像n一样的东西!(n个阶乘)步骤来解决它们。但是,如果为您提供了NP完全问题的解决方案,则可以在多项式时间内对其进行验证。

NP完全问题的一个典型例子是旅行商问题。”

作者:ApoxyButt来自:http ://www.everything2.com/title/NP-complete


2

NP问题:

  1. NP问题是可以在不确定的多项式时间内解决的问题。
  2. 非确定性算法分两个阶段运行。
  3. 非确定性猜测阶段&&非确定性验证阶段。

Np问题的类型

  1. NP完成
  2. NP硬

NP完整问题:-

1个决策问题A如果具有以下两个属性,则称为NP完成:

  1. 它属于NP类。
  2. NP中的所有其他问题都可以在多项式时间内转换为P。

一些前:-

  • 背包问题
  • 子集和问题
  • 顶点覆盖问题

有关您阶段的快速问题...验证阶段不能确定吗?在P时间中没有验证NP问题
Branden Keck

1

NP完全问题是一组问题,对于这些问题,可以在多项式时间内减少任何其他NP问题,并且仍然可以在多项式时间内验证其解。即,任何NP问题都可以转化为任何NP完全问题。– NP完全问题是一个NP问题,至少和NP中的任何其他问题一样“困难”。


1

据我所理解

P是可以使用确定性TM在多项式时间内解决的一组问题。

NP是需要不确定的TM以便在多项式时间内解决的一组问题。这意味着要并行检查所有可能的变量,每个实例花费多项式时间。如果问题可以解决,那么这些并行状态中的至少一种必须解决该问题。这也意味着,如果您对解变量进行猜测,那么唯一需要做的就是检查多项式时间内解的有效性。

NP-Hard是问题至少与NP一样困难的领域。NP中的任何问题都可以在多项式时间内转换为NP-Hard问题。如果P不等于NP,则无法在多项式时间内解决这些问题。也就是说,当NP中最困难的问题是多项式时间可解时,那么只有NP-Hard问题才是多项式时间可解。

NP-Complete是NP与NP-Hard的交集。任何NP问题都可以在多项式时间内转化为NP-Complete问题。这意味着,如果任何NP-Complete都可以有一个有效的解决方案,那么任何NP问题都可以以相同的效率解决。

如果我有任何错误,请告诉我。


-17

NP问题是可以在多项式时间内创建一种验证解决方案的计算机算法的问题。

一个NP完全问题是NP,但是如果您可以在多项式时间内求解它(称为P),那么所有NP问题都是P。

所以开始吧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.