假设你有一些数学背景,你会如何向外行人概述计算复杂度理论?
我希望得到一个关于 P=NP 问题的解释。P是什么?NP又是什么?NP-Hard 又是什么?
有时维基百科描述问题时好像读者已经理解了所有相关概念。
假设你有一些数学背景,你会如何向外行人概述计算复杂度理论?
我希望得到一个关于 P=NP 问题的解释。P是什么?NP又是什么?NP-Hard 又是什么?
有时维基百科描述问题时好像读者已经理解了所有相关概念。
噢,博士论文的回忆。好的,我们开始吧。
我们从决策问题的概念开始,这是一个算法可以始终回答“是”或“否”的问题。我们还需要计算机的两个模型(图灵机,确切地说):确定性和非确定性。确定性计算机是我们平常想到的常规计算机;非确定性计算机与我们习惯的计算机一样,只不过具有无限并行性,因此每当你遇到一个分支时,就会生成一个新的“进程”并检查两侧。就像Yogi Berra所说的那样,当你来到岔路口时,你应该走它。
如果已知存在一个多项式时间算法来获得答案,则决策问题在P中。如果已知存在一个非确定性机器的多项式时间算法来获得答案,则决策问题在NP中。
已知在P中的问题显然也在NP中 - 非确定性机器从未费心生成另一个进程,而只像确定性机器一样运行。已知有些问题既不在P中也不在NP中; 一个简单的例子是枚举长度为n的所有位向量。无论如何,这都需要2n步。
(严格来说,如果非确定性机器可以在多项式时间内得出答案,并且确定性机器可以在多项式时间内验证解决方案的正确性,则决策问题在NP中。)
但是,已知存在一些问题属于NP问题,但没有已知的多项式时间确定性算法;换句话说,我们知道它们属于NP问题,但不知道它们是否属于P问题。传统的例子是旅行商问题的决策问题版本(decision-TSP):给定城市和距离,是否存在一条覆盖所有城市并在小于x距离内返回起点的路线?在非确定性机器上很容易解决,因为每当非确定性旅行商来到一个岔路口时,他都会走这条路:他的克隆前往下一个未访问的城市,最后他们比较笔记,看看是否有任何克隆体所走的距离小于x。 (然后,指数级别的克隆体将互相竞争,以决定哪些必须被杀死。)目前还不知道决策TSP是否属于P问题:没有已知的多项式时间解决方案,但也没有证明不存在这样的解决方案。现在,再介绍一个概念:给定决策问题P和Q,如果一个算法可以在多项式时间内将P问题的解转化为Q问题的解,那么就称Q问题是多项式可约的(或者只是可约的)到P问题。所使用的形式化方法是将决策问题(具有Yes / No答案的问题,例如“这个图是否有哈密顿回路”)看作是“语言” - 字符串集合 - 输入,其答案为Yes。有一个正式的概念来定义“计算机”(图灵机),如果存在一个多项式时间算法可以在图灵机上决定该问题(给定输入字符串,判断是Yes还是No),则该问题属于P。
如果问题可以在多项式时间内进行检查,则该问题属于NP,即对于答案为Yes的输入,可以提供一个(多项式大小的)证书,您可以在多项式时间内检查答案是否为Yes。 [例如,如果提供一个哈密顿回路作为证书,您显然可以检查它是否是一个哈密顿回路。]
它并没有说明如何找到该证书。显然,您可以尝试“所有可能的证书”,但这可能需要指数时间;不清楚是否总是需要超过多项式时间来决定Yes或No;这就是P与NP问题。
如果能够解决该问题意味着能够解决NP中的所有问题,则该问题属于NP-hard。
还请参阅此问题: 计算机科学中的NP完全问题是什么?
但实际上,所有这些可能对您来说都很模糊;花时间阅读例如Sipser的书是值得的。这是一个美丽的理论。
这是对Charlie帖子的评论。
如果你能证明一个问题(1)属于NP,且(2)可以通过多项式时间归约到已知的NP完全问题,那么这个问题就是NP完全问题。
第二个条件存在一个微妙的错误。实际上,你需要证明一个已知的NP完全问题(比如说Y)可以在多项式时间内归约到这个问题(我们称之为问题X)。
这种证明方法的推理基础在于,如果你能将一个NP完全问题归约到这个问题,并以某种方式在多项式时间内解决这个问题,那么你也成功地找到了解决NP完全问题的多项式时间解决方案,这将是一件非常了不起的事情(如果不是不可能的话),因为那样你就成功地解决了长期存在的P = NP问题。
另一种证明方法是考虑使用反证法技巧,其本质上是指如果Y --> X,那么~X --> ~Y。换句话说,无法在多项式时间内解决Y意味着也无法在多项式时间内解决X。另一方面,如果你能够在多项式时间内解决X,那么你也能够在多项式时间内解决Y。此外,你还可以通过传递性在多项式时间内解决所有归约到Y的问题。
希望我上面的解释足够清晰。一个好的参考书是Kleinberg和Tardos的《算法设计》第8章或Cormen等人的第34章。
很不幸,我所知道的最好的两本书(Garey and Johnson和Hopcroft and Ullman)都从研究生证明导向的数学水平开始。这几乎肯定是必要的,因为整个问题很容易被误解或错误描述。当杰夫试图以太过民间化/幽默化的语气处理这个问题时,他几乎被人咬掉了耳朵。
也许最好的方法就是通过大量实践使用大O符号使用大量示例和练习。另请参见这个答案。然而,请注意,这并不完全相同:单独的算法可以用渐近线来描述,但说一个问题具有某种复杂度是关于所有可能的算法的陈述。这就是为什么证明如此复杂的原因!以下是关于该主题的一些链接:
如果您熟悉集合基数的概念,即集合中元素的数量,则可以将问题视为P代表整数的基数,而NP则是一个谜:它是否与所有实数的基数相同或更大?
根据你的时间安排,也许最好从DFA、NDFA开始,然后展示它们的等效性。这样他们就能理解ND与D的区别,并且会因此更好地理解正则表达式。