,, -complete和 -hard 的定义是什么?


247

我正在上一门有关计算复杂性的课程,无法理解这些术语的含义。

我只知道NP是NP-complete的子集,而NP-hard是NP-hard的子集,但我不知道它们的实际含义。维基百科也没有太大帮助,因为解释仍然太高了。


6
它是带有正式定义的正式对象。我发现缺少大多数“简单”的解释。如果您在理解定义时遇到问题,那么在关于复杂性理论的课程中您要做什么?(一个严重的问题。)顺便说一句,维基百科不是TCS的很好参考。
拉斐尔

17
并非所有人都知道是真的:NPC(NP完成)是NP的子集,而不是相反。完整性始终包括成为问题要解决的类的一个要素。此外,NP并不是NP困难的子集,因为NP中的每个问题都不是困难的。
frafl 2013年

5
@frafl:“并不是NP中的每个问题都很难解决”-仍有待证明。
拉斐尔

2
@Raphael:这实际上取决于您使用的减少类型。我认为多项式时间有很多简化,其中。NPC
frafl 2013年

Answers:


364

我认为Wikipedia的 ,和比较不错。我仍然要说的是:第一部分第二部分PNPPNP

[我将在方括号内使用备注来讨论一些技术细节,如果需要,可以跳过这些技术细节。]


第一部分

决策问题

存在各种各样的计算问题。但是,在计算复杂性理论课程的简介中,更容易关注决策问题,即答案为“是”或“否”的问题。还有其他类型的计算问题,但是大多数时候,关于它们的问题可以简化为关于决策问题的类似问题。此外,决策问题非常简单。因此,在介绍计算复杂性理论课程时,我们将注意力集中在决策问题的研究上。

我们可以使用答案为是的输入子集来确定决策问题。这简化表示法,使我们能够写出 代替和 代替。xQQ(x)=YESxQQ(x)=NO

另一个观点是,我们正在讨论集合中的成员资格查询。这是一个例子:

决策问题:

输入:自然数, 问题:是偶数吗?xX
x

会员问题:

输入:自然数, 问:在?xX ë v ë Ñ = { 0 2 4 6 }
xEven={0,2,4,6,}

我们将输入的“是”答案视为接受输入,将输入的“否”答案视为拒绝输入。

我们将研究决策问题的算法,并讨论这些算法在可计算资源使用中的效率如何。我将依靠您从像C这样的语言进行编程的直觉来代替正式定义我们所说的算法和计算资源的含义。

[备注:1.如果我们想正式,准确地做所有事情,则需要修复像标准Turing机器模型这样的计算模型,以精确定义算法的含义及其对计算资源的使用。2.如果要讨论模型无法直接处理的对象的计算,则需要将其编码为机器模型可以处理的对象,例如,如果使用图灵机,则需要对诸如自然数和图形之类的对象进行编码作为二进制字符串。]


P = 寻找解决方案的高效算法的问题

假设高效算法是指最多使用多项式计算资源的算法。我们关注的主要资源是关于输入大小的最坏情况算法的运行时间,即算法对大小为的输入采取的基本步骤。如果输入位计算机内存来存储,则输入的大小为,在这种情况下,我们写。因此所谓高效算法,是指具有多项式最坏情况运行时间的算法nxnnx|x|=n

多项式时间算法可以捕捉有效算法的直观概念的假设被称为Cobham的理论。在这一点上,我不会讨论是否是有效解决问题的正确模型,以及是否能够捕获在实践中及相关问题中可以有效计算的内容。目前,有充分的理由进行此假设,因此出于我们的目的,我们假设是这种情况。如果您不接受Cobham的论点,那不会使我在下面写下的内容不正确,我们唯一会失去的就是直觉PP在实践中进行有效的计算。我认为这对于开始学习复杂性理论的人来说是一个有用的假设。

P是可以有效解决的
决策问题,即具有多项式时间算法的决策问题。

更正式地说,我们说决策问题在 iff中QP

有一个有效的算法使得 对于所有输入,AX
x

  • 如果则, Q(x)=YESA(x)=YES
  • 如果则。Q(x)=NOA(x)=NO

我可以简单地写但是我这样写,所以我们可以将其与的定义进行比较。A(x)=Q(x)NP


NP =用于验证证明/证书/证人的高效算法的问题

有时候,我们不知道找到答案的一个决策问题的任何有效的方法,但是如果有人告诉我们答案,给了我们一个证明 ,我们可以有效地验证答案是通过检查证明正确的,看它是否是一个有效的证明。这就是复杂度类。NP

如果证明太长,它并没有真正的用处,那么花很长时间来阅读证明就更不用说检查它是否有效了。我们希望验证所需的时间在原始输入的大小上合理,而不在给定证明的大小上合理!这意味着我们真正想要的不是任意的长证明,而是证明。注意,如果验证者的运行时间是原始输入大小的多项式,则它只能读取证明的多项式部分。因此,简而言之,我们指的是多项式大小

只要我使用“证明”一词,就表示这一点,我的意思是“简短证明”。

这是一个问题的示例,我们不知道如何有效解决,但可以有效地验证证明:

分区
输入:一组有限的自然数,问题:是否可以将划分为两组和 (和) ,以使中的数字之和等于的数字总和()?S小号= 小号= Σ X X = Σ X X
SABAB=SAB=
ABxAx=xBx

如果我给您并询问您是否可以将它分成两组,以使它们的和相等,那么您将不知道有任何有效的算法来求解它。您可能会尝试使用所有可能的方法将数字分成两部分,直到找到一个总和相等的分区,或者尝试了所有可能的分区并且没有一个起作用为止。如果其中任何一个有效,您会说“是”,否则您会说“否”。S

但是可能的分区数量成倍增加,因此将花费大量时间。但是,如果我给您两组和,则可以轻松地检查和是否相等以及和是否为的分区。请注意,我们可以有效地计算总和。ABABS

在这里,我给您的和对是肯定答案的证明。您可以通过查看我的证据并检查它是否有效来有效地验证我的主张。如果答案为“是”,则有一个有效的证明,我可以提供给您,您可以有效地进行验证。如果答案为否,则没有有效的证据。因此,无论我给您什么,您都可以检查并查看它不是有效的证明。我不能以无效的证明欺骗您,答案是肯定的。回想一下,如果证明太大,将需要很多时间来验证它,我们不希望发生这种情况,因此我们只关心有效的证明,即具有多项式大小的证明。AB

有时人们使用“ 证书 ”或“ 证人 ”代替“证明”。

请注意,我为您提供了有关给定输入的答案的足够信息, 以便您可以有效地查找和验证答案。例如,在我们的分区示例中,我没有告诉您答案,我只是给您一个分区,您可以检查该分区是否有效。请注意,您必须自己核实答案,您不能相信我所说的话。此外,您只能检查我的证明的正确性。如果我的证明有效,则表示答案为“是”。但是,如果我的证明是无效的它并没有意思的答案是否定的。您已经看到一个证据是无效的,而不是没有有效的证据。我们正在谈论证明是的。我们不是在谈论否定证据。x

让我们看一个例子: 和证明 可以分为两个集合,相等的总和。我们只需要对的数字和的数字求和,看看结果是否相等,然后检查,是否为分区。A={2,4}B={1,5}S={1,2,4,5}ABABS

如果我给您和,您将检查并确认我的证明无效。这并不意味着答案是否定的,仅意味着该特定证明无效。您的任务不是寻找答案,而是检查给出的证据是否有效。A={2,5}B={1,4}

就像学生在考试中解决问题,然后教授检查答案是否正确一样。:)(不幸的是,学生往往没有提供足够的信息来验证答案的正确性,教授们不得不猜测其余的部分答案,并决定他们应该为学生的部分答案给多少分,这确实很困难任务)。

令人惊讶的是,相同的情况也适用于我们要解决的许多其他自然问题: 我们可以有效地验证给定的简短证明是否有效,但是我们不知道找到答案的任何有效方法。这就是为什么动机复杂类是非常有趣的 (虽然这不是定义它的原始动机)。无论您做什么(不仅在CS中,而且在数学,生物学,物理学,化学,经济学,管理,社会学,商业等方面),您都将面临此类中的计算问题。要了解中到底有多少问题,请查看 NPN P N PNPNP优化问题纲要。确实,您将很难找到中没有的自然问题。简直太神奇了。NP

NP是具有有效验证器的一类问题,即,
存在可以验证给定解是否正确的多项式时间算法。

更正式地说,我们说决策问题在 iff中QNP

有一个称为验证程序的有效算法, 对于所有输入, V
x

  • 如果则存在证明,使得,Q(x)=YESyV(x,y)=YES
  • 如果则对于所有证明,。Q(x)=NOyV(x,y)=NO

我们说一个检验是声音 ,如果它不接受任何证据的时候,答案是NO。换句话说,如果答案确实是“否”,则不能欺骗声音验证者接受证明。无误报。

同样, 如果回答为“是”,则验证者如果接受至少一个证明,则说该验证者是完整的。换句话说,可以使一个完整的验证者确信答案为是。

该术语来自逻辑和证明系统。我们不能使用隔音系统来证明任何虚假陈述。我们可以使用完整的证明系统来证明所有真实陈述。

验证者获得两个输入,V

  • x:的原始输入,和Q
  • y:的建议证明。Q(x)=YES

请注意,我们希望在的大小上有效。如果是一个很大的证明验证器将能够读取只有一个多项式部分的。这就是为什么我们要求证明要简短。如果简短,则说在是有效的, 与说在和是有效的 (因为的大小由的大小的固定多项式为界)有关。Vxyÿ ÿ V X V X ÿ ÿ XyyVxVxyyx

总之,表明决策问题是 ,我们需要提供一个有效的验证算法是健全完善QNP

历史记录:历史上这不是的原始定义。原始定义使用的是非确定性图灵机。这些机器与任何实际的机器模型都不对应,并且很难习惯(至少当您开始学习复杂性理论时)。我已经读到很多专家认为他们会使用验证者定义作为主要定义,甚至会 代替并将其命名为(用于多项式验证)。NPV P N P N PVPNP 如果他们回到计算复杂性理论的曙光。验证者定义更自然,更易于概念理解,并且更易于用于显示问题,它们位于。NP


PNP

因此,我们有 =有效可解 =有效可验证。因此,可以有效验证的问题与可以有效解决的问题相同。PNPP=NP

请注意,中的任何问题也都在,即,如果您可以解决问题,则还可以验证给定的证明是否正确:验证者只会忽略该证明!PNP

那是因为我们不需要它,验证者可以自己计算答案,可以在没有任何帮助的情况下确定答案是是还是否。如果答案为“否”,我们知道应该没有证明,我们的验证者只会拒绝所有建议的证明。如果答案为“是”,则应该证明,实际上我们将接受任何东西作为证明。

[我们可以使我们的验证者仅接受其中一些,只要我们的验证者接受至少一个证明该验证者能够正确解决该问题的证据,也可以。

这是一个例子:

总和
输入:列表的自然数,和,问:是?n+1a1,,ansn i = 1 a i = s
Σi=1nai=s

问题出在因为我们可以对数字求和,然后将其与进行比较,如果它们相等则返回YES,否则返回NO。Ps

问题也存在于。考虑一个验证者,该验证者得到证明加上Sum的输入。它的作用方式与我们上面描述的中的算法相同。这是Sum的有效验证者。NPVP

请注意,还有其他一些有效的Sum验证程序,其中一些可能会使用提供给他们的证明。但是,我们设计的那不是,这也很好。由于我们为Sum提供了有效的验证程序,因此问题出在。相同的技巧适用于所有其他问题,因此 。NPPPNP


和蛮力/穷举搜索算法NPNPExpTime

我们知道的解决中任意问题的最佳算法是 蛮力 / 穷举搜索算法。为问题选择一个有效的验证器(根据我们的假设,它在具有一个有效的验证器),并逐一检查所有可能的证明。如果验证者接受其中之一,则答案为“是”。否则答案为否。NPNP

在我们的分区示例中,我们尝试所有可能的分区,并检查所有分区中的总和是否相等。

请注意,蛮力算法在最坏情况下的指数时间内运行。证明的大小是输入大小的多项式。如果证明的大小为则可能有证明。检验每个选项将花费验证者多项式时间。因此,总的来说,蛮力算法需要花费指数时间。m2m

这表明任何问题都可以在指数时间内解决,即 。(此外,蛮力算法将仅使用多项式空间,即 但这是另一回事了。)NPNPExpTimeNPPSpace

在的一个问题可具有更快的算法,在例如任何问题具有多项式时间算法。但是,对于的任意问题, 我们不知道可以做得更好的算法。换句话说,如果您只是告诉我您的问题出在 (关于该问题的其他内容),那么我们所知道的最快的算法将花费指数时间。NPPNPNP

但是,这并不意味着没有更好的算法, 我们也不知道。据我们了解,和所有问题仍然有可能(尽管几乎所有复杂性理论家都认为不太可能) 可以在多项式时间内解决。NP=PNP

此外,一些专家推测,我们无法做得更好,即中存在的问题无法比蛮力搜索算法(要花费大量时间)更有效地解决。有关 更多信息,请参见指数时间假说。但这还没有得到证明,这只是一个推测。它仅显示了距离找到针对任意问题的多项式时间算法还有多远。NPNP

这种与指数时间的联系使某些人感到困惑:他们错误地认为 问题需要指数时间来解决(甚至更糟糕的是根本没有针对他们的算法)。声明 中存在问题并不意味着问题很难解决,仅表示易于验证,这是解决问题难度的上限,许多由于易于解决。NPNPNPPNP

尽管如此,仍有问题似乎很难解决。在讨论硬度时,我将回到这一点。NPNP


下界似乎难以证明

好的,所以我们现在知道中存在 许多自然问题,我们不知道任何有效的解决方法,并且我们怀疑它们确实需要指数时间才能解决。我们可以证明这一点吗?NP

不幸的是,证明下界的任务非常困难。我们甚至不能证明这些问题所需要的不仅仅是线性时间!更不用说需要指数时间了。

证明线性时间下界很容易:算法毕竟需要读取输入。证明超线性下界是完全不同的故事。我们可以对正在考虑的算法类型施加更多限制,从而证明超线性下界,例如使用比较对算法进行排序,但是没有这些限制,我们不知道下界。

为了证明问题的上限,我们只需要设计一个足够好的算法即可。要想出这样的算法,通常需要知识,创造性思维甚至是独创性。

但是,与证明下限相比,该任务要简单得多。我们必须证明没有好的算法。不是我们现在不知道任何足够好的算法,而是还不存在任何好的算法没有人会提出好的算法。如果您之前没有想过一分钟,我们怎么能显示出这种不可能的结果

这是另一个让人感到困惑的地方。这里的“不可能”是数学上的不可能,也就是说,对于某些天才来说,将来可以解决的问题并非短时间。当我们说不可能时,我们说这绝对是不可能的,因为是不可能的。科学上的进步无法实现。这就是我们在证明下界时所做的事情。1=0

为了证明一个下界,即表明问题需要时间来解决一些量,意味着我们必须证明,任何即使是非常不了解的算法,也无法更快地解决问题。我们知道许多聪明的想法(贪婪,匹配,动态编程,线性编程,半定性编程,平方和编程以及许多其他聪明的想法),还有许多我们还不知道的想法。仅排除一种算法或一种特定的设计算法思想是不够的,我们需要排除所有算法,即使是我们尚不了解的算法,甚至可能永远都不知道的算法!而且可以将所有这些组合到一种算法中,因此我们还需要排除它们的组合。在表明某些想法无法解决困难的方面取得了一些进展NP问题,例如贪婪及其扩展无法工作,并且有一些与动态编程算法有关的工作,还有一些有关使用线性编程的特定方法的工作。但是,这些甚至还不能排除我们所知道的聪明的想法(如果您感兴趣,请在受限的计算模型中搜索下界)。


障碍:下界很难证明

另一方面,我们有称为障碍的数学结果 ,该结果 表示下界证明不可能是某某某物,而某某某事几乎涵盖了我们用来证明下界的所有技术!实际上,继亚历山大·拉兹巴洛夫(Alexander Razbarov)和史蒂芬·鲁迪奇(Steven Rudich)的自然证据壁垒得出结果之后,许多研究人员放弃了证明下界的工作 。事实证明,特定种类的下界证明的存在将暗示加密伪随机数生成器和许多其他加密工具的不安全性。

我说这几乎是因为近年来,Ryan Williams主要取得了一些进展 ,能够智能地规避障碍物结果,但迄今为止的结果仍然是针对非常弱的计算模型,而且还远远没有排除一般的多项式时间算法。

但是我在分歧。我想说明的主要问题是证明下界是困难的,对于解决问题的通用算法,我们没有强大的下界。NP

[另一方面,瑞安·威廉姆斯(Ryan Williams)的工作表明,证明下界与证明上限之间存在紧密的联系。如果您有兴趣,请参阅他在ICM 2014上的演讲。]


减少:使用另一个问题作为子例程/ Oracle /黑匣子来解决问题

归约的想法非常简单:要解决问题,请对另一个问题使用算法。

这是一个简单的示例:假设我们要计算自然数列表的总和,并且有一个算法返回两个给定数字的总和。我们可以使用将列表中的数字相加吗?当然!nSumSum

问题:

输入:自然数, 输出:返回。 nx1,,xn
i=1nxi

约简算法:

  1. s=0
  2. 对于从到 2.1。 i1n
    s=Sum(s,xi)
  3. 返回s

这里我们在算法中使用作为子例程。请注意,我们不在乎工作方式,它对我们而言就像黑盒子一样,我们不在乎内发生了什么。我们通常将子例程称为oracle。就像希腊神话中的德尔斐的先知一样,我们提出问题,然后先知回答他们,然后使用答案。SumSumSumSum

本质上,这就是简化的含义:假定我们有一个问题的算法并将其用作解决另一个问题的预言。在这里,高效是指假设甲骨文在一个时间单位内回答,即表示我们对甲骨文的每次执行都进行了单步计算。

如果Oracle返回一个大的答案,我们需要阅读它,这可能需要一些时间,所以我们应该算所花费的时间我们看答案,甲骨文已经给我们。同样,用于从oracle编写/询问问题。但是,甲骨文可以立即起作用,即,一旦我们向甲骨文提出问题,甲骨文便会在单个时间单位内为我们写下答案。oracle所做的所有工作都计入一个步骤,但这不包括我们编写问题和阅读答案所花费的时间。

因为我们不在乎oracle的工作方式,而只关心它返回的答案,所以我们可以简化一下,并认为oracle本身就是问题所在,而不是算法本身。换句话说,我们不在乎oracle是否不是算法,我们不在乎oracle如何提出其答复。

例如, 上述问题中的是加法函数本身(而不是用于计算加法的算法)。Sum

我们可以向一个oracle提出多个问题,而这些问题并不需要预先确定:我们可以提出一个问题,并根据oracle返回的答案,我们自己执行一些计算,然后根据获得的答案提出另一个问题。前一个问题。

另一种看待此问题的方法是将其视为交互式计算。交互式计算本身就是一个大话题,因此我在这里不做介绍,但是我认为提及这种减少的观点可能会有所帮助。

的算法一个使用ORACLE /黑匣子通常被表示为。AOAO

我们上面讨论的约简是最普遍的约简形式,被称为黑盒约简 (aka oracle约简图灵约简)。

更正式地:

我们说问题对于问题是黑盒可归约的,并且写如果 存在算法使得对于所有输入,。QOQTO
Ax
Q(x)=AO(x)

换句话说,如果有一个算法其中使用Oracle作为子程序和解决问题。AOQ

如果我们的简化算法在多项式时间内运行,我们把它叫做一个多项式时间黑箱减少或只是库克减少 (以纪念 斯蒂芬A.库克)和写。(下标代表Alan Turing的荣誉为“ Turing” )。AQTPOT

但是,我们可能想对归约算法与oracle交互的方式施加一些限制。研究了几种限制,但最有用的限制是称为多对一缩减 (又称为映射缩减)的限制。

这里的想法是,在给定的输入,我们执行多项式时间计算并生成 ,这是oracle解决的问题的一个实例。然后,我们询问预言机,并将其返回给我们。我们被允许从甲骨文提出一个问题,而甲骨文的答案是将返回什么。xy

更正式地说,

我们说,问题是许多一还原成问题写当且仅当 有一个算法,使得对所有输入,。QOQmO
Ax
Q(x)=O(A(x))

当约简算法为多项式时间时,我们称其为 多项式多次多约简或简称为Karp约简(以纪念 Richard M. Karp),并用。QmPO

对这种特殊的非交互式约简的兴趣的主要原因是,它保留了问题:如果存在从问题到问题的多项式时间多一约简,则也位于。NPANPBANP

简化的简单概念与,和 -complete(我们将在下面讨论)一起,是复杂性理论中最基本的概念之一。PNPNP


帖子过长,超出了答案的上限(30000个字符)。我将在第二部分中继续回答。



4
@Kaveh这是一个很棒的帖子,谢谢。我在课堂上的这一节之前确实做了可判定性,但是我对证明不可判定性的理解有些落后。我不知道这与我缺乏对复杂性的了解有关。
agent154 2013年

5
从入门级(包括Sipser的)到更高级的本书,我都读了许多复杂性书籍。我对抽象数学没有问题(例如,我能够阅读郎的代数)。这个答案是最好的解释NP vs. P的方法。我建议您花更多的时间来完善它,并做一些讲义。它可以帮助很多人。
scaaahu 2013年

@scaaahu,谢谢您的友好评论和建议。我打算尽快完成并完善此功能。
卡夫

10
该答案应作为参考答案。首先应参考以后所有将来的P / NP类型基本问题。非常流畅的描述!
Paresh

179

第二部分

第一部分

前一个超过了答案中允许的最大字母数(30000),因此我将其分为两部分。

NP完整性:通用 问题NP

好的,到目前为止,我们已经讨论了有效可解决问题的类别()和有效可验证问题的类别(ñ PPNPNPNP

现在有时候我们想说一个问题很难解决。但是,正如我们上面提到的,我们不能为此目的使用下界:理论上,下界正是我们想要证明的,但是在实践中,我们在证明下界方面并不是很成功,并且总体上我们很难证明以上。还有没有办法说一个问题很难解决

NPNP

减少为相对难度

ABAB

ABAB

MBABMBANBMBNMNA

P

NPNP

NPNP

NPNP
NPNP

ANP

ANP
NPBBABmPA

NPNPNPNP

NPNP

(很多人正在为工业上的实际使用而优化算法的另外两个问题是整数编程约束满足问题。根据您的问题和实例,您关心其中一种算法的优化算法可能会比其他。)

如果一个问题满足完整性定义中的第二个条件(即普遍性条件), 我们将其称为 -hardñ PNP
NP

NP硬度是说问题很困难的一种方式。

我个人更喜欢将 -hardness视为通用性,因此 -universal可能是一个更正确的名称,因为我们目前不知道它们是否真的很难或者仅仅是因为我们无法为其找到多项式时间算法)。ñ PNPNP

-hard 这个名称也使人们误以为 -hard问题是绝对难以解决的问题。我们还不知道,我们只知道它们与任何问题一样难以解决。尽管专家认为不太可能,所有问题都可以轻松有效地解决。换句话说,像其他问题一样困难并不意味着真正困难。仅当存在问题是绝对困难的(即没有任何多项式时间算法)时,这才是正确的。N P N P N P N P N PNPNPNPNPNPNP

现在的问题是:

  • NP

  • 我们知道其中任何一个吗?

NPNPNPNP

NPExpTimeNPNP

p¬p

NPNP

ANPABBNPNPAABNPB

NPNPNP

NPNP

SATNPSATSubsetSumNPSATSubsetSum

NP

NP

注意: 以下部分可能是一读的技术文章。

NP


Vxtk
YESkVxtNO

UniVerNP

VNPxVxUniVer
tkVxVx

tttk

NPUniVerNP


MxMt
YESMxYEStNOYESt

CPt

Interpreter

UniVerNPMxtkcckInterpreterMYESxct

SATNP

UniVerNPUniVerNP

NPSAT

SAT


φ
YESφNO

SATNP


待写...

NP

NP

NP

PNP

下一步是什么?然后去哪儿?


6
希望我可以投票一次以上,谢谢您付出如此多的努力!
Fingolfin 2013年

2
哇,真棒!我也非常期待发布的零件,特别是“如果必须解决NP完全问题该怎么办?”。
Tobias Hermann 2014年

5
@ xci13可以!支持第一部分;)
Vince Emigh 2014年

4
我在这里创建了一个帐户,只是为了对您的两个帖子进行投票!
ghosts_in_the_code

6
@Kaveh是否有计划完成这篇精彩的文章?
加布


8

将我的答案复制到关于堆栈溢出的类似问题:

在不涉及技术问题的情况下,解释P诉NP等最简单的方法是将“单词问题”与“多项选择问题”进行比较。

当您尝试解决“单词问题”时,您必须从头开始找到解决方案。当您尝试解决“多项选择题”时,您有一个选择:要么像解决“单词问题”那样解决它,要么尝试插入提供给您的每个答案,然后选择合适的候选答案。

通常会发生“多选题”比相应的“单词题”容易得多的情况:替换候选答案并检查它们是否适合可能比从头开始找到正确答案要花费更少的精力。

现在,如果我们同意花费多项式时间“轻松”的努力,则类别P将包括“容易单词问题”,而类别NP将由“容易多项选择问题”组成。

P v。NP的实质是一个问题:“是否存在不像单词问题那样容易的简单选择题”?也就是说,是否存在可以轻松验证给定答案的有效性但很难从头开始找到答案的问题?

既然我们能直观地理解NP是什么,我们就必须挑战直觉。事实证明,从某种意义上说,存在着所有问题中最难解决的“多选问题”:如果能够找到这些“最难解决”问题中的一个的解决方案,那么一个人就能找到所有问题的解决方案。 NP问题!当库克在40年前发现这一点时,这完全是一个惊喜。这些“最困难的”问题被称为NP困难。如果您找到其中一个的“单词问题解决方案”,您将自动为每个“简单的多项选择题”找到一个“单词问题解决方案”!

最后,NP完全问题是同时存在NP和NP困难的问题。按照我们的类比,它们同时“容易选择问题”和“最困难的单词问题”。


既然我们能直观地理解NP是什么,我们就必须挑战直觉。事实证明,这里存在“多项选择题” -您是说“单词题”吗?我认为是因为所有NP问题都容易定义为“多选”。
德米特里·格里戈里耶夫

经行原来也有“多选问题”,在某种意义上说,是他们全部的最难我的意思是原来有NP问题,在某种意义上说,是他们所有的最困难的。从定义上说,这些NP问题确实是容易的多项选择问题,但它们也是单词问题中最难解决的。标准示例是SAT3:作为多选题很容易,但作为单词却很难。
Michael

7

其中最简单的是P,在多项式时间内可解决的问题就在这里。

然后是NP。在不确定的图灵机上可在多项式时间内解决的问题属于此。

硬度和完整性必须降低。的问题的是为C类,如果用C的每一个问题简化为A.如果问题A是很难NP,或NP-硬,如果在每一个NP问题简化为A.

最后,如果一个类C C中并且对于C 来说很困难,则该问题是完整的。在您的情况下,如果NP中的每个问题都归结为A,并且A在NP中,则问题A 对NP来说完整的,或者NP完全。 。

为了进一步说明NP,当且仅当可以在(确定性)多项式时间内验证解决方案时,NP才会出现问题。考虑一下您知道的任何NP完全问题,例如SAT,CLIQUE,SUBSET SUM,VERTEX COVER等。如果“获得解决方案”,则可以在多项式时间内验证其正确性。它们分别是变量的真值分配,完整的子图,数字子集和支配所有边的顶点集。


6

对于基础知识,P vs. NP和Computational Complexity Zoo视频似乎更容易理解。

对于问题很大的计算机:

P问题

容易解决(魔方)

NP问题

很难 -但是检查答案很容易(数独)

也许这些都是P问题,但我们不知道... P vs. NP

NP完全

许多NP问题归结为同一问题(数独是该列表中的新手)。

EXP问题

真的很难(国际象棋最好的下一步)

NP难题

编辑: NP-hard在视频中没有得到很好的解释(都是粉红色的),维基百科的NP-hard Euler图对此更为清晰。

影片摘要

P,NP,NP-complete,EXP和NP-hard的黑板欧拉图

维基百科NP-hard Euler图

P,NP,NP完全和NP硬的SVG欧拉图


0

PNPNP-completeNP-hard是复杂度类别,根据解决问题的算法复杂度对问题进行分类。简而言之,它们基于三个属性:

复杂度等级表

可在多项式时间内解决:可以由确定性图灵机(DTM)使用多项式的计算时间来解决的决策问题,即,其运行时间由该算法的输入大小的多项式表达式上限。使用Big-O表示法,此时间复杂度定义为O(n ^ k),其中n是输入的大小和ka常数系数。

可在多项式时间内验证的解决方案:定义决策问题,即使获得正确的解决方案可能需要更长的时间,DTM仍可以使用多项式的计算时间来验证给定的解决方案。

减少多项式时间中的任何NP问题:定义决策问题,其求解算法可用于解决多项式时间转换步骤之后的任何NP问题。


我最近写了一篇有关该主题的文章,提供了更多详细信息,包括将NP问题简化为NP难题的代码演示:问题的复杂性类别

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.