复杂性类gydF4y2Ba
复杂性类gydF4y2Ba都是gydF4y2Ba复杂性理论gydF4y2Ba这是理论计算机科学的中心话题。复杂度类包含一组需要类似空间和时间范围来解决的问题,例如“所有问题都可以在多项式时间内就输入大小解决”,“所有问题都可以在指数空间内就输入大小解决”,等等。通过在抽象计算模型(通常为a)上运行问题,可以证明问题属于特定的复杂度类gydF4y2Ba图灵机gydF4y2Ba.计算机科学中一些最大的未解决问题都与证明两个复杂度类是否等价有关,最著名的例子是臭名昭著的gydF4y2BaP = npgydF4y2Ba问题-科学家迄今为止还不能证明或推翻P类和NP类的相等性。gydF4y2Ba
有数百个复杂性类,本页将描述几个最常遇到的类。gydF4y2Ba
内容gydF4y2Ba
复杂性类gydF4y2Ba
复杂性课程帮助计算机科学家根据解决问题和验证解决方案所需的时间和空间对问题进行分组。例如,复杂性可以帮助描述一个过程需要多少步骤gydF4y2Ba图灵机gydF4y2Ba决定一个问题gydF4y2Ba ?扎实掌握的gydF4y2Ba大0符号gydF4y2Ba是理解复杂性类所必需的。gydF4y2Ba
一些复杂性类是其他复杂性类的子集。例如,在确定性多项式时间内可解决的一类问题,gydF4y2Ba ,是一类可在非确定性多项式时间内解决的问题的子集gydF4y2Ba .gydF4y2Ba
的gydF4y2Ba时间复杂度gydF4y2Ba算法的长度通常用于描述解决问题所需的步数,但它也可以用于描述验证答案所需的时间gydF4y2BaNPgydF4y2Ba部分)。寻找时间复杂度的方法有很多。人们可以通过确定某一行代码在程序中执行了多少次,或者通过计算图灵机在解决问题时走了多少步来计算时间复杂度。了解算法的时间复杂度有助于程序员和计算机科学家了解算法是否有效。它帮助我们知道一个算法需要多长时间才能给出答案。gydF4y2Ba
的gydF4y2Ba空间复杂度gydF4y2Ba一个算法的内存大小描述了该算法需要多少内存才能运行。就图灵机而言,解决一个问题所需的空间与图灵机磁带上需要的空间数量有关。gydF4y2Ba
有关空间复杂性和时间复杂性的更多信息,请参见gydF4y2Ba空间层次定理gydF4y2Ba和gydF4y2Ba时间层次定理gydF4y2Ba
复杂性类是组织类似类型问题的有用方法。对于许多复杂性类,存在许多开放问题—例如,如果gydF4y2Ba这gydF4y2Ba复杂度类等于gydF4y2Ba那gydF4y2Ba复杂性类。在其中一些问题中,如果答案是"是的,他们是平等的"那么就会产生巨大的理论后果gydF4y2Ba多项式的层次结构gydF4y2Ba在复杂性方面,类从数百个层次分解为几个层次,并且有许多实际应用。比如,如果结果是gydF4y2Ba 在美国,许多保护我们的电脑、银行等的安全算法将会过时。gydF4y2Ba
PgydF4y2Ba
类gydF4y2Ba 包含决策问题(答案为“是”或“否”的问题),可由确定性图灵机在多项式时间内解决。有时这种说法是这样的:gydF4y2Ba 是由确定性图灵机在多项式时间内判定的一类语言。gydF4y2Ba
许多问题都可以用计算机来解决gydF4y2Ba蛮力gydF4y2Ba方法,但这通常需要gydF4y2Ba指数gydF4y2Ba时间。如果一个问题有一个多项式时间算法,它可以比暴力方法更有效地解决。在实践中实际使用的许多算法都是多项式时间算法——指数时间算法通常用处较小,尽量避免使用。gydF4y2Ba
一个问题gydF4y2Ba 可以在gydF4y2Ba 某个常数的时间gydF4y2Ba 在哪里gydF4y2Ba 是输入的大小。gydF4y2Ba
一旦发现了某个问题的多项式时间算法,通常就有可能改进它的运行时间。例如,两个n位数相乘的简单算法的运行时间为gydF4y2Ba .的gydF4y2BaKaratsuba算法gydF4y2Ba在朴素算法的基础上进行了改进,可以将两个n位数相乘gydF4y2Ba 时间。这些都是多项式时间的运行时间,但Karatsuba方法有更小的常数因子。gydF4y2Ba
P中的问题gydF4y2Ba
判断数字是否为gydF4y2Ba互质gydF4y2Ba
NP和coNPgydF4y2Ba
类gydF4y2Ba 包含决策问题(答案为“是”或“否”的问题),这些问题可以由图灵机解决gydF4y2Ba不确定的gydF4y2Ba多项式时间——这包括在多项式时间内可解决的问题到在指数时间内可解决的问题。虽然这些问题需要很长时间才能解决,但问题在于gydF4y2Ba 可以gydF4y2Ba验证gydF4y2Ba一个多项式时间的图灵机。这意味着如果给出一个“是”的答案gydF4y2Ba 你可以在多项式时间内检验它是否正确。这种“是”的回答通常被称为“是”gydF4y2Ba见证gydF4y2Ba或者一个gydF4y2Ba证书gydF4y2Ba.gydF4y2Ba
例如,大数因式分解是一种gydF4y2Ba 问题。如果给你一个很大的数并问它的质因数分解是什么,你可能会花很长时间来做这个。然而,如果有人声称他们知道一个给定的大数的质因数分解,那就很容易验证这一点——只要把他们得出的因数相乘,看看乘积是否就是原始的大数。gydF4y2Ba
证明问题的存在gydF4y2Ba 通常包括展示您可以提供一个可以在多项式时间内验证的见证字符串。gydF4y2Ba
包含在gydF4y2Ba ,可以写成gydF4y2Ba ,但不知道是否gydF4y2Ba 而且gydF4y2Ba 是gydF4y2Ba平等的gydF4y2Ba.然而,大多数理论计算机科学家认为gydF4y2Ba .gydF4y2Ba
才把gydF4y2Ba
如果有问题gydF4y2Ba 是在gydF4y2Ba ,然后是它的补体,gydF4y2Ba 是在gydF4y2Ba .gydF4y2Ba 包含对“没有”答案具有多项式时间验证的问题-如果给出了一个不能解决问题的解决方案,则很容易验证该解决方案是否无效。gydF4y2Ba
一个问题gydF4y2Ba 是一个gydF4y2Ba可满足性问题gydF4y2Ba被称为gydF4y2Ba 在哪里gydF4y2Ba .要提供"不"的证人只要提供一个例子gydF4y2Ba做gydF4y2Ba有一个令人满意的任务,这可以在多项式时间内检查。如果建议的赋值结果令人满意,则知道该实例不是的成员gydF4y2Ba .但是,如果证人串不能提供令人满意的任务,那就没有了gydF4y2Ba证明gydF4y2Ba这就是问题所在gydF4y2Ba是gydF4y2Ba在gydF4y2Ba -一个“不”的证人可能还有待提出。gydF4y2Ba
为gydF4y2Ba 而且gydF4y2Ba 问题,你不需要能够在多项式时间内一次性验证所有的"是"或"否"答案,你只需要能够在多项式时间内验证一个特定的"是"或"否"答案,这样问题就存在了gydF4y2Ba 或gydF4y2Ba [2]gydF4y2Ba.证明问题的存在gydF4y2Ba 通常涉及提供一个可以在多项式时间内验证的见证字符串。gydF4y2Ba
有些问题在gydF4y2Ba .这类问题的性质是,“是”和“否”见证字符串都可以在多项式时间内检查。这包括所有的问题gydF4y2Ba .换句话说,gydF4y2Ba 是两者的子集吗gydF4y2Ba 而且gydF4y2Ba .gydF4y2Ba
举个例子,gydF4y2Ba 这决定了一个数字gydF4y2Ba 是一个gydF4y2Ba主要的gydF4y2Ba号码。这是一个问题gydF4y2Ba 因为检查一个数字是否不是质数是很容易的——提出的反证明,证人串,只包括这个数字的因数。如果因数不是gydF4y2Ba 而且gydF4y2Ba ,我们已经成功验证了一个“否”的答案。还有一种情况是gydF4y2Ba 是在gydF4y2Ba 这意味着验证一个“是”的证人也需要多项式的时间。事实上,gydF4y2Ba素性测试gydF4y2Ba是一个问题gydF4y2Ba 证明这是计算机科学的一个巨大进步。gydF4y2Ba
不知道是否gydF4y2Ba ,尽管大多数理论计算机科学家认为它们是不相等的。gydF4y2Ba
键关系gydF4y2Ba
NP问题gydF4y2Ba
保理gydF4y2Ba(也看到gydF4y2BaRSAgydF4y2Ba)gydF4y2Ba
布尔可满足性(gydF4y2BaCircuit-SATgydF4y2Ba,gydF4y2Ba坐gydF4y2Ba,gydF4y2Ba3-SATgydF4y2Ba等)gydF4y2Ba
np完全问题gydF4y2Ba
问题是gydF4y2Ba ,有时写成gydF4y2Ba ,如果两者都在gydF4y2Ba ,是gydF4y2Ba .gydF4y2Ba
赋权gydF4y2Ba
一个gydF4y2Ba 问题是gydF4y2Ba至少一样难gydF4y2Ba作为最难的问题gydF4y2Ba .一个问题gydF4y2Ba 是gydF4y2Ba 如果对于每个问题gydF4y2Ba 在gydF4y2Ba ,有一个多项式时间gydF4y2Ba减少gydF4y2Ba从gydF4y2Ba 来gydF4y2Ba .另一种更普遍的说法是,这是个问题gydF4y2Ba 是否可以简化为问题gydF4y2Ba 如果是解决问题的算法gydF4y2Ba 也可以用来解决问题gydF4y2Ba .gydF4y2Ba
问题并不一定存在gydF4y2Ba ,而且它们不必是可决定的。例如,gydF4y2Ba停止问题gydF4y2Ba是一个gydF4y2Ba 问题,但不是问题gydF4y2Ba 问题。gydF4y2Ba
非完全多项式gydF4y2Ba
问题是非常特殊的,因为任何问题gydF4y2Ba 类可以被转换或gydF4y2Ba减少gydF4y2Ba成gydF4y2Ba 多项式时间的问题。这意味着如果你能解一个gydF4y2Ba 问题,你可以解决任何其他问题gydF4y2Ba .一个重要的结果是,如果你能解一个gydF4y2Ba 在多项式时间内,你可以解决任何问题gydF4y2Ba 多项式时间内的问题。gydF4y2Ba
的gydF4y2BaCook-Levin定理gydF4y2Ba说明可满足性问题gydF4y2Ba .gydF4y2Ba
np完全的问题gydF4y2Ba
布尔可满足性(Circuit-SAT, SAT, 3-SAT等)gydF4y2Ba
RP和公司gydF4y2Ba
类gydF4y2Ba ,随机多项式时间,是存在a的一类gydF4y2Ba概率图灵机gydF4y2Ba具有以下属性:gydF4y2Ba
它总是在输入大小的多项式时间内运行gydF4y2Ba
如果正确答案是“不”,它gydF4y2Ba总是gydF4y2Ba返回“不”gydF4y2Ba
如果正确答案是“是”,那么它至少有可能返回“是”gydF4y2Ba *,否则返回“no”。gydF4y2Ba
这意味着如果正确答案是“no”,那么算法肯定会返回“no”,但如果正确答案是“yes”,算法可能会在一半的时间内返回错误的答案(“no”)。如果算法确实返回“是”,那么答案肯定是“是”——“是”的答案总是正确的,但“否”的答案可能是错误的。gydF4y2Ba
*gydF4y2Ba 这里是任意选择的,但类gydF4y2Ba 用二分之一来定义。由于误差是片面的,因此进行多次试验可以减少误差,这就是所谓的gydF4y2Ba放大gydF4y2Ba.如果算法重复gydF4y2Ba Times独立:拒绝字符串gydF4y2Ba 如果任何gydF4y2Ba 运行拒绝和接受gydF4y2Ba 否则。算法出错并返回错误答案的概率gydF4y2Ba 次是gydF4y2Ba ,趋于0gydF4y2Ba 增加。gydF4y2Ba
类似于gydF4y2Ba 而且gydF4y2Ba 的补码,有一个类包含gydF4y2Ba 被称为gydF4y2Ba .gydF4y2Ba
定义如下:gydF4y2Ba
它总是在输入大小的多项式时间内运行gydF4y2Ba
如果正确答案是“是”,它gydF4y2Ba总是gydF4y2Ba返回“是的”gydF4y2Ba
如果正确答案是“no”,那么它至少有可能返回“no”gydF4y2Ba ,否则返回“yes”。gydF4y2Ba
这意味着如果答案是“是”,那么算法肯定会返回“是”,但如果答案是“否”,算法可能会返回一个不正确的答案。gydF4y2Ba
两者都存在一些问题gydF4y2Ba 而且gydF4y2Ba ,即gydF4y2Ba .gydF4y2Ba
的子集gydF4y2Ba .不知道是否gydF4y2Ba .gydF4y2Ba 也是gydF4y2Ba 目前还不知道是否gydF4y2Ba .gydF4y2Ba 的子集gydF4y2Ba ,gydF4y2Ba 的子集gydF4y2Ba .gydF4y2Ba
键关系gydF4y2Ba
这与gydF4y2Ba随机算法gydF4y2Ba.gydF4y2Ba
BPP和ZPPgydF4y2Ba
BPPgydF4y2Ba
(有界误差概率多项式时间)是存在一个gydF4y2Ba概率图灵机gydF4y2Ba具有以下特性:具有以下特性:gydF4y2Ba
它保证在多项式时间内运行gydF4y2Ba
在任何给定的算法运行中,它的概率不超过gydF4y2Ba 不管答案是"是"还是"不是"gydF4y2Ba
这意味着如果正确答案是“是”,算法将输出一个具有概率的“是”gydF4y2Ba .如果正确答案是“否”,算法将输出一个具有概率的“否”gydF4y2Ba .如果正确答案是“no”,算法将输出一个概率为“yes”(错误答案)gydF4y2Ba .如果正确答案是“yes”,算法将输出一个概率为“no”(错误答案)gydF4y2Ba .gydF4y2Ba
蒙特卡罗算法gydF4y2Ba都在gydF4y2Ba 类。gydF4y2Ba
不知道是否gydF4y2Ba ,但许多计算机科学家认为它们是平等的。来发现gydF4y2Ba 会和解决gydF4y2Ba 问题。这将表明是否每个概率算法都可以被确定性算法所取代。gydF4y2Ba
腭咽gydF4y2Ba
(零误差概率多项式时间)是存在a的类gydF4y2Ba概率图灵机gydF4y2Ba具有以下属性:gydF4y2Ba
它保证在多项式时间内运行gydF4y2Ba
它可能会返回“是”、“不是”或“我不知道”的答案gydF4y2Ba
如果它返回“是”或“否”,那么这就是正确答案gydF4y2Ba
它以概率返回“我不知道”gydF4y2Ba
这意味着if总是返回正确答案或“我不知道”,机器将以小于或等于一半的概率返回“我不知道”。gydF4y2Ba
类gydF4y2Ba 正好等于gydF4y2Ba 而且gydF4y2Ba .gydF4y2Ba
拉斯维加斯算法gydF4y2Ba均包括在gydF4y2Ba 类。gydF4y2Ba
键关系gydF4y2Ba
PSPACE, NPSPACE和EXPSPACEgydF4y2Ba
类gydF4y2Ba 这组决策问题是可以用a来解决的吗gydF4y2Ba确定的gydF4y2Ba在图灵机的多项式空间量相对于输入大小。gydF4y2Ba 这组决策问题是可以用a来解决的吗gydF4y2Ba不确定的gydF4y2Ba在图灵机的多项式空间量相对于输入大小。同样的,gydF4y2Ba 这组决策问题是可以被解决的吗gydF4y2Ba确定的gydF4y2Ba在一个相对于输入大小的指数量空间中的图灵机。gydF4y2Ba
通过gydF4y2BaSavitch定理gydF4y2Ba 而且gydF4y2Ba .gydF4y2Ba
而且gydF4y2Ba 都包含在gydF4y2Ba ,但不知道其中是否有相互等价的。gydF4y2Ba
键关系gydF4y2Ba
另请参阅gydF4y2Ba
参考文献gydF4y2Ba
- 雅各布斯,K。gydF4y2Ba计算理论gydF4y2Ba.检索2016年6月26日,从gydF4y2Bahttp://ocw.mit.edu/courses/mathematics/18-404j-theory-of-computation-fall-2006/gydF4y2Ba
- ,。gydF4y2Ba才把gydF4y2Ba.检索2016年6月26日,从gydF4y2Bahttps://en.wikipedia.org/wiki/Co-NPgydF4y2Ba
- B。gydF4y2BaP np np-complete np-hard.svggydF4y2Ba.检索2016年6月29日,从gydF4y2Bahttps://en.wikipedia.org/wiki/File:P_np_np-complete_np-hard.svggydF4y2Ba
- ,问。gydF4y2Ba复杂度子集是pspacegydF4y2Ba.检索2016年6月29日,从gydF4y2Bahttps://en.wikipedia.org/wiki/File:Complexity_subsets_pspace.svggydF4y2Ba