试图理解P vs NP vs NP Complete vs NP Hard


38

我试图理解这些分类以及它们为什么存在。我的理解正确吗?如果没有,那怎么办?

  1. P是多项式复杂度,或对于某些非负实数(例如)等。如果问题属于P,则至少存在一种可以在多项式时间内从头解决的算法。例如,我总是可以通过遍历并检查每一步是否除以整数来确定某个整数是否为质数。O(nk)kO(1), O(n1/2), O(n2), O(n3)n2 <= k <= sqrt(n)kn

  2. NP是不确定的多项式复杂度。我真的不知道不确定性意味着什么。我认为这意味着在多项式时间内进行验证很容易,但是如果我们不知道答案,那么从头开始求解可能不是多项式时间。由于它可以在多项式时间内求解,因此所有P问题也是NP问题。引用整数分解作为NP的示例,但我个人不理解为什么它不是P,因为试验分解需要O(sqrt(n))时间。

  3. NP完全我完全不了解,但是引用了旅行商问题。但是在我看来,TSP问题可能只是NP,因为它需要采取某种措施来验证您是否已预先确定路径。O(2n n2) time to solve, but O(n)

  4. 我认为NP-Hard充满未知数。难以验证,难以解决。


4
您是否读过关于CS.SE的问题,P,NP,NP-complete和NP-hard的定义是什么?

我还没有看到那个链接,不。我会仔细阅读,谢谢
Nakano

1
CS.SE的答案令人鼓舞,但我认为有可能对这些术语的含义给出非常简洁且无误导的解释,而无需赘述太多。@Nakano会对简短的“切题”答案感兴趣,还是CS.SE帖子解决了您的问题?
Ixrec

@MichaelT我仔细阅读了该链接,发现它确实很冗长,而且在几点上都不太清楚。我觉得这给了我更多的问题而不是答案。
中野

1
“非确定性”可以解释为“给定选择,计算机每次都会选择正确的选择”。
托尔比约恩Ravn的安徒生

Answers:


39

您基本上对P和NP是正确的,但对NP难和NP完全则不正确。

首先,这是所讨论的四个复杂度类的超简洁定义:

  • P是一类决策问题,可以通过确定性图灵机在多项式时间内解决。

  • NP是一类决策问题,可以通过非确定性图灵机在多项式时间内解决。同样,这是一类问题,可以通过确定性图灵机在多项式时间内验证

  • NP-hard是一类决策问题,可以通过确定性图灵机在多项式时间内将NP中的所有问题归结为此类问题。

  • NP-complete是NP-hard和NP的交集。等效地,NP-完全是NP中的决策问题,通过确定性图灵机可以将NP中的所有问题简化为多项式时间。

这是来自维基百科的Euler图显示了这四个类之间的关系(假设P不等于NP):

在此处输入图片说明

我认为您最不熟悉或困惑的部分是从问题X到问题Y的“多项式时间缩减”的概念。从X到Y的缩减只是一种算法A,它通过使用一些算法来解决X如果A的除B之外的所有部分都具有多项式时间复杂度,则这种减少称为“多项式时间减少”。举一个简单的例子,在数组中找到最小元素的问题可以在时间上归类为排序问题,因为您可以对数组进行排序,然后返回已排序数组的第一个元素。

关于NP难定义的一个容易遗漏的事情是,从NP问题到NP难问题的减少,但反之则不一定。这意味着NP难题可能在NP中,或者在更高的复杂度等级中(如从Euler图中看到的),或者它们甚至不是可判定的问题。这就是为什么人们在试图非正式地解释这些东西时经常说类似“ NP困难意味着至少与NP一样困难”的原因。

停止问题是NP难题的一个很好的例子,而NP显然没有NP难题,如Wikipedia所述

很容易证明暂停问题是NP难题,但不是NP难题。例如,布尔可满足性问题可以通过将其转换为尝试所有真值分配的图灵机的描述,并在找到满足该公式的图灵机的描述时,将其停止,否则将陷入无限循环。还很容易看到停止问题不在NP中,因为NP中的所有问题都可以在有限的操作中确定,而停止问题通常是不确定的。


3
@Nakano直观地讲,这是一种“减少”,即一个问题正在成为其他问题的子问题。这些缩减中的一些会增加复杂性,而不是通过对“子问题”的错误选择来降低复杂性,这实际上意味着您永远不会在任何实际代码中使用这些缩减。老实说,NP-hard确实使我感到奇怪,但并不十分有趣。忽略它,只是将NP-完全问题视为所有其他NP问题都减少到的NP问题集,可能会更有成果。
Ixrec

1
@Nakano stackoverflow.com/questions/12637582/...我认为简单的答案是,当人们谈论整数分解为NP他们通常谈论真正巨大的整数,而您通常开始n的做你的大O样张“整数在内存中所占的位数”,而不是“传递给函数的整数数”。
Ixrec '16

1
@Nakano如果我链接的SO问题和我的评论不足以为您解决该问题,则可能值得特别提出一个有关此整数分解问题的新问题。
Ixrec '16

2
@Nakano:采用big-O表示法,n是对输入大小(元素,字节,数字等的大小)的度量,而不是输入值的度量。
Bart van Ingen Schenau,2016年

2
@Nakano简短的答案是您没事,这就是为什么在进行时间复杂度分析时,您始终需要指定n的含义。n是“输入大小”的说法只是对我们通常选择定义n的方式的简要概述。它不是big-O表示法或时间复杂性的严格定义的一部分。我相信您正确地说,当n是输入时,整数分解为O(sqrt(n))。碰巧的是,复杂度的结果是,n表示尺寸通常比n表示值的尺寸实用得多。
Ixrec

7

引用整数分解作为NP的示例,但是我个人不理解为什么它不是P,因为试验分解需要O(sqrt(n))时间。

出于复杂性类的目的,n是输入的长度。因此,如果要分解integer kn则不是not,k而是log k要记下位数的位数(或其他)。整数分解就O(sqrt(k))如您所说,但这就是。O(sqrt(2n))O(2(n/2))

我认为NP-Hard充满未知数。难以验证,难以解决。

否。NP-Hard只是解决问题的难易程度。

NP-Hard问题至少是NP中最困难的问题。我们知道它们至少很难,因为如果我们有一个解决NP-Hard问题的多项式时间算法,我们就可以使该算法适应NP中的任何问题。

NP完全我一点都不懂

NP-Complete意味着NP和NP-Hard都是问题。这意味着我们可以快速验证解决方案(NP),但其难度至少与NP中最困难的问题(NP-Hard)一样。

我真的不知道不确定性意味着什么。

非确定性是NP的另一种定义。非确定性的图腾机可以有效地随时复制自身,并让每个副本采用不同的执行路径。在这个定义下,NP是计算机可以在多项式时间内解决的问题的集合,而这些问题可以自由地复制自身。事实证明,这与可以在多项式时间内验证的问题完全相同。


那么$ O(n ^ k)$时间算法有可能是NP问题吗?
中野

k是一个常数?是。所有的P问题也是NP问题。显然,可以在多项式时间内求解的任何事物也可以在多项式时间内验证。
Winston Ewert

长度/大小在这里实际上是如何定义的?例如,我可以大写$ n $并在写时减小其长度。有关不明确地处理整数,但说有$ V $顶点和$ E $边等图形的问题是什么
中野

@Nakano,实际上,一个较大的基数不会改变它,因为这只是一个恒定的因子差异。因此,它不会影响多项式与非多项式。但是,如果您将数字写成一元,那么它将改变它。
Winston Ewert

2
@Nakano,嗯...我不敢向五岁的孩子解释复杂性课程。:P
温斯顿·埃韦特

5

首先要了解的是,PNP语言进行分类,而不是问题。要理解这意味着什么,我们首先需要一些其他定义。

一个字母是一个非空符号的有限集合。

{ 01}和ASCII字符集一样都是字母。{}不是字母,因为它为空。N(整数)不是字母,因为它不是有限的。

Σ为字母。数量有限,从符号的有序级联Σ被称为Σ

该字符串101是字母{ 01}上的一个单词。该空字(通常写为ε)是在任何字母词。字符串penguin是包含ASCII字符的字母上的单词。数π的小数点符号不超过拼音一个字{ .0123456789},因为它不是有限的。

单词w长度,写为| w |,是其中的符号数。

例如,| hello| = 5和| ε | =0。对于任何单词w,| |。w | ∈ Ñ因此有限。

Σ为字母。集合Σ *包含了所有单词Σ,包括ε。集合Σ +包含了所有单词Σ,不含ε。对于ÑÑΣ Ñ是设定长度的字的Ñ

对于每个字母ΣΣ Σ +是无限可数的集合。对于ASCII字符集Σ ASCII,正则表达式.*,并.+分别表示Σ ASCII *Σ ASCII +分别。

{ 01} 7是该组的7位ASCII码{ 00000000000001,...,1111111}。{ 01} 32是32位整数值的集合。

Σ是字母和大号&SubsetEqual; Σ *L被称为Σ之上的语言

对于字母Σ,空集和Σ Σ之上的平凡语言。前者通常被称为空语言。空语言{}和仅包含空词{ ε } 的语言是不同的。

与非NaN IEEE 754浮点值相对应的{ 01} 32子集是一种有限语言。

语言可以有无限多个单词,但是每种语言都是可数的。一组琴弦{ 12,...}表示整数十进制是在字母表无限语言{ 0123456789}。无穷集合字符串{ 23571113,...}十进制表示素数是其子集。包含与正则表达式匹配的所有单词[+-]?\d+\.\d*([eE][+-]?\d+)?的语言是ASCII字符集上的一种语言(表示由C编程语言定义的有效浮点表达式的子集)。

没有一种语言包含所有实数(以任何符号),因为实数集不可计数。

Σ是字母和大号&SubsetEqual; Σ *。一种机器d 决定 大号如果对于每个输入瓦特&Element; &Sigma; *它计算特性函数 χ 大号瓦特在有限时间内)。特征函数定义为

χ 大号Σ * →{0,1}
     瓦特   ↦1,   瓦特大号 
         0,否则。

这种机器被称为判定大号。我们写“ d瓦特)= X ”,“给予瓦特d输出X ”。

机器型号很多。今天最实用的一种是图灵机的模型。图灵机具有无限的线性存储,它们聚集在单元中。每个单元在任何时间点都可以恰好容纳一个字母符号。图灵机按照一系列计算步骤执行其计算。在每一步中,它都可以读取一个单元格,可能会覆盖其值,并将读/写头向左或右单元格移动一个位置。机器将执行的操作由有限状态自动机控制。

具有有限指令集和无限存储空间的随机访问计算机是另一种与图灵计算机模型一样强大的计算机模型。

为了便于讨论,我们不会打扰我们使用的精确机器模型,而足以说这台机器具有有限的确定性控制单元,无限的存储空间,并按照一系列可以计算的步骤进行计算。

既然您在问题中使用过它,我假设您已经熟悉“ big-O”表示法,因此这里只是快速复习。

fN →为一个函数。该组Ô˚F)包含的所有功能ÑÑ为其存在常数Ñ 0ÑÇÑ使得对于每ÑÑÑ > Ñ 0这是事实,Ñ)≤ Ç ˚Fn)。

现在,我们准备解决真正的问题。

P包含所有语言大号存在用于其图灵机d,其判定大号和恒定ķÑ使得对于每个输入瓦特d至多后暂停Ť(| 瓦特 |)为函数的步骤ŤÔññ ķ)。

由于Øññ ķ),而数学是正确的,是不方便的写入和读取,大多数人-说实话,每个人除了我自己-平时写简单Øñ ķ)。

请注意,边界取决于w的长度。因此,您为质数语言所做的论点仅适用于无格式编码中的数字,其中对于数字n的w,编码的长度| w | 与n成正比。实际上,没有人会使用这种编码。但是,使用比尝试所有可能的因素更高级的算法,可以证明,如果输入以二进制(或其他基数)编码,质数的语言将保留在P中。(尽管有很大的兴趣,但这只能由Manindra Agrawal,Neeraj Kayal和Nitin Saxena证明。 在2004年的获奖论文中,您可以猜测该算法不是非常简单。)

平凡的语言{}和Σ 和非平凡的语言{ ε }显然在P中(对于任何字母Σ)。您是否可以使用自己喜欢的编程语言编写函数,这些函数将字符串作为输入并返回一个布尔值,以说明字符串是否是每种语言所用语言中的单词,并证明您的函数具有多项式运行时复杂性?

每种正则语言(由正则表达式描述的语言)都以P表示

Σ是字母和大号&SubsetEqual; Σ *。一种机器V,它利用两个词的编码元组瓦特Ç&Element; &Sigma; *并输出0或1的有限数量的步骤之后是验证大号如果它具有下列性质。

  • 给定(瓦特Ç),V输出1仅当瓦特大号
  • 对于每瓦特大号,存在ç&Sigma; *,使得V瓦特Ç)= 1。

上面定义中的c称为见证人(或证书)。

即使w实际上在L中,也允许验证者为错误的证人提供假阴性。但是,不允许其提供误报。还要求该语言中的每个单词至少要有一个见证人。

对于语言组合,包含为整数的十进制编码不是黄金,证人可能是一个因式分解。例如,(659, 709)467231∈COMPOSITE 的见证人。在没有证人的情况下,您可以轻松地在纸上验证,如果不使用计算机,很难证明467231不是主要的。

我们没有说如何找到合适的证人。这是不确定的部分。

NP包含所有语言大号存在用于其图灵机V,用于验证大号和恒定ķÑ使得对于每个输入(瓦特Ç),V暂停后至多Ť(| 瓦特 |)为函数的步骤Ťøññ ķ)。

注意上面的定义意味着每个w ^大号存在证人Ç与| c | ≤ 牛逼(| W ^ |)。(图灵机可能无法查看证人的更多符号。)

NPP的超集(为什么?)。不知道是否存在NP中的语言,但不存在P中的语言

整数分解本身不是一种语言。但是,我们可以构建一种语言来表示与之相关的决策问题。也就是说,它包含了所有元组语言(Ñ),使得Ñ具有因子dd。让我们将此语言称为FACTOR。如果您有确定FACTOR的算法,则可以通过对每个素因数执行递归二进制搜索,将其用于仅使用多项式开销来计算完全因式分解。

容易证明FACTOR在NP中。适当的见证人,简直是因子d本身和所有验证程序将要做的就是核实dñ国防部d = 0。所有这一切都可以在多项式时间内完成。(请再次记住,编码的长度很重要,并且在n中是对数的。)

如果您可以证明FACTOR也在P中,那么您可以肯定会获得很多炫目的奖项。(而且您已经破坏了当今加密技术的很大一部分。)

对于NP中的每种语言,都有一种蛮力算法可以确定性地决定它。它只是对所有证人进行详尽的搜索。(请注意,证人的最大长度受多项式的限制。)因此,您决定PRIMES的算法实际上是决定COMPOSITE的蛮力算法。

为了解决您的最后一个问题,我们需要引入减少。归约是理论计算机科学的一个非常强大的概念。将一个问题简化为另一个问题基本上意味着通过解决另一个问题来解决一个问题。

Σ为字母,ABΣ上的语言。多项式时间许多酮还原如果存在函数˚FΣ * →交通Σ *具有以下属性。

  • 瓦特   ⇔   ˚F瓦特)∈   所有瓦特&Sigma; *
  • 图灵机可以针对每个输入w,以由|的多项式为边界的多个步长来计算函数fw |。

在这种情况下,我们写一个p

例如,设A为包含所有包含三角形的图形(编码为邻接矩阵)的语言。(一个三角形是一个长度为3的循环。)进一步,B是包含所有非零轨迹矩阵的语言。(矩阵的迹线是其主对角线元素的总和)。然后是多项式时间许多酮还原为。为了证明这一点,我们需要找到合适的变换函数f。在这种情况下,我们可以设置f来计算邻接矩阵的3 幂。这需要两个矩阵矩阵乘积,每个矩阵乘积都具有多项式复杂度。

这是平凡真实的大号p 大号。(您能正式证明吗?)

我们现在将其应用于NP

语言大号NP难的当且仅当大号 “≤ p 大号每种语言大号 ”∈ NP

一个NP难的语言可能会或可能不会在NP本身。

语言大号NP -完全当且仅当

  • 大号NP
  • LNP-硬的。

NP最著名的完整语言是SAT。它包含所有可以满足的布尔公式。例如,(一个b)∧(¬ 一个 ∨¬ b)∈周六 有效证人为{ a = 1,b = 0}。式(一个b)∧(¬ 一个b)∧¬ b ∉周六 (您将如何证明?)

不难证明SAT∈NP。证明SAT 的NP硬度是一项工作,但它是1971年由Stephen Cook完成的

一旦知道一种NP完全语言,通过还原来显示其他语言的NP完全相对简单。如果语言已知是NP -hard,然后示出了一个p 表明,NP -hard,太(经由“≤的传递p ”)。1972年,理查德·卡普公布的21种语言,他可以表现出人的名单NP-通过(传递)降低SAT完成。(这是我实际上建议您阅读的该答案中的唯一论文。与其他论文不同,它不难理解,并且很好地说明了如何通过还原证明NP-完整性。)

最后,简短总结。我们将使用符号NPHNPC分别表示NP-硬语言和NP-完整语言的类别。

  • PNP
  • NPCNPNPCNPH,实际上NPC = NPNPH定义
  • NP)∧(NPH)⇒   p

请注意,列入全国人大NP是正确的,即使在该情况下P = NP。要看到这一点,请使自己清楚,不能将非平凡的语言简化为平凡的语言,并且P中存在平凡的语言,而NP中存在非平凡的语言。但是,这是一个(不太有趣的)极端情况。

附录

您的主要困惑的来源似乎是自己所想的“的ñ ”在“ Øñ˚Fñ))”作为解释的算法的输入时,它实际上指的是长度的输入。这是一个重要的区别,因为这意味着算法的渐近复杂度取决于用于输入的编码

本周,已知最大的梅森素数达到了新记录。当前已知的最大质数是2 74 207 281 −1。这个数字太大,令人头疼,因此在以下示例中使用较小的素数:2 31 – 1 = 2 147 483 647。以不同的方式进行编码。

  • 通过其梅森指数作为十进制数字:31(2个字节)
  • 作为十进制数字:2147483647(10个字节)
  • 作为一元数:11111…11其中将被2147483640多1秒(几乎2 GiB)代替

所有这些字符串都编码相同的数字,并且只要给出其中任何一个,我们就可以轻松构造相同数字的任何其他编码。(如果需要,可以将十进制编码替换为二进制,八进制或十六进制。它只会将长度更改为常数。)

用于测试素数的幼稚算法仅适用于一元编码的多项式。所述AKS素性测试是多项式为小数(或任何其他碱b ≥2)。的卢卡斯-莱默检验法是最好的已知算法梅森素数中号pp为奇素数,但它仍然是在梅森指数的二进制编码的长度的指数p(在多项式p)。

如果我们想谈一谈算法的复杂性,那么非常清楚我们使用什么表示就非常重要。通常,可以假定使用了最有效的编码。也就是说,二进制为整数。(请注意,并非每个素数都是梅森素数,因此使用梅森指数不是一般的编码方案。)

在理论密码学中,许多算法都正式传递了一个完全无用的k 1 s 字符串作为第一个参数。该算法从不考虑此参数,但允许它形式上是k的多项式,k是用于调整过程安全性的安全性参数

对于二进制编码的决策语言为NP -complete的某些问题,如果将嵌入数字的编码切换为一元,则决策语言将不再是NP -complete。即使到那时,其他问题的决策语言仍然是NP-完整的。后者称为NP- complete。最著名的例子是装箱

观察(如果可能)输入压缩后算法的复杂度如何变化,这也可能(或者可能更有趣)。对于Mersenne素数的示例,我们已经看到了三种编码,每种编码的对数压缩程度都比其前身更高。

1983年,Hana Galperin和Avi Wigderson撰写了一篇有趣的文章,介绍了当图形的输入编码被对数压缩时常见图形算法的复杂性。对于这些输入,从上方包含三角形的图形的语言(明显在P中)突然变为NP-完全的

那是因为像PNP这样的语言类是为语言而不是问题定义的。


这个答案可能对理解问询者没有帮助。阅读其他答案,看看Nanako正在努力解决什么。您认为这个答案对他/她有帮助吗?
Andres F.

这个答案可能对OP没有帮助,但肯定会帮助其他读者(包括我自己)。
加百利

4

我将尽力减少对它的非正式定义。

P问题:可以在多项式时间内解决的问题。包含可以有效解决的问题。

NP问题:可以在多项式时间内验证的问题。例如:旅行商,电路设计。NP问题有点像谜题(如数独)。给定正确的问题解决方案,我们可以非常快速地检查我们的解决方案,但是,如果我们实际尝试解决问题,则可能要花很长时间。

现在,P vs NP实际上询问是否可以快速检查其解决方案是否正确的问题,那么总有一种快速的解决方案。因此用数学术语写:NP是P的子集吗?

现在回到NP完成:这些是NP问题中真正困难的问题。因此,如果有更快的方法解决NP完全问题,则NP完全问题变成P,并且NP问题陷入P。

NP难:甚至在多项式时间内无法检查的问题也是NP难。例如,选择国际象棋中的最佳动作就是其中之一。

如果仍然不清楚,请尝试观看以下视频:https : //www.youtube.com/watch?v=YX40hbAHx3s

我希望这将提供一些模糊的轮廓。

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.