title: To P or not to P——这是最伟大的计算机数学问题
permalink: https://zhuanlan.zhihu.com/p/420772986
author: 康托的天堂
author_id: 37badb617c1845a82c3e22bc612dac55
column: 发现数学之美
column_id: c_1231908331896975360
voteup: 16 赞同
created: 2021-10-12 08:53:20
updated: 2021-10-12 08:53:20
fetched: 2022-12-14 14:40:00
count: 约 4594 字
version:
tags: [数学学习, 数学, 计算机科学, 康托的天堂, 发现数学之美]
To P or not to P——这是最伟大的计算机数学问题
from 专栏 发现数学之美
数学学习, 数学, 计算机科学, 康托的天堂, 发现数学之美
2000年5月24日,新罕布什尔州的克莱数学研究所列出了数学和计算机科学中七个未解决的问题。解决其中任何一个问题的奖励是该研究所提供的一张100万美元的支票。然而,直到今天,这些问题中只有一个被解决了,那就是 庞加莱猜想( Poincaré Conjecture ) ——被俄罗斯数学家格里戈里-佩雷尔曼解决。重要的是要认识到,这些问题的 "解 "是以数学证明的形式出现的,要么否认,要么确认该定理。其他六个未解决的问题之一是著名的P vs NP问题。
对时间复杂度的研究可以得到很好的复杂度(下面解释)。麻省理工学院的迈克尔·西普塞(Michael Sipser)教授因其在计算复杂性理论领域的杰出工作而闻名,他给出的标准定义是:
让M是一个确定性的图灵机( Turing machine),它对所有的输入上都会 停机( halt,停机问题是逻辑学的焦点,也是第三次数学危机的解决方案 ) 。M的运行时间或 时间复杂度 是函数f:N→N,其中f(n)是M对任何长度为n的输入所使用的最大步骤数。习惯上我们用n来表示输入的长度。
看完定义应该比较懵逼吧?这到底是什么意思呢?现在,让我们降低维度来看这个问题。一个算法的 时间复杂度 可以被描述为该算法在计算机上对给定输入长度的 运行时间 。确定一个给定程序的时间复杂度可能很困难,所以计算机科学家们开发了一种称为 渐近分析( asymptotic analysis ) 的估计表达式,也称为 大O表示 。做好准备,另一个复杂的定义正在向你走来:
让f和g是函数f , g : N → R+。如果存在正整数c和n0,使每个整数n≥n0,f(n)≤cg(n),则称f(n)=O(g(n))。
当f(n)=O(g(n))时,我们说g(n)是f(n)的上限,或者更准确地说,g(n)是f(n)的渐近上限,以强调我们在抑制常数因素。
让我们暂时跳过第一部分,更仔细地看一下定义的第二部分。我们将在这里使用一个例子:
为了找到这个算法的渐进上限,我们必须首先分析各部分。如果本例中数组n的大小为10,则循环将运行10次。在这种情况下,函数的上限将永远是n的大小。因此,n是渐进的上限,计算机科学家用来描述这一事实的符号是O(n),这被称为 线性时间( linear time ) 。
这里的函数有两个for循环,意味着如果n=10,它将被运行100次,或n*n次。大O的表达是O(n^2),或者说是 平方时间( quadratic time ) 。
假设一个算法,我们能够确定其时间复杂度为f(n)=4n²+2n+12,这是否意味着 大O 将是 O(4n²+2n+12)? 重要的是再看一下定义的最后一部分,我们正在寻找渐近线,因此我们只需要增速最快的项(在这种情况下是4n^2),并且我们去掉常数(因为常数可以根据硬件差异和限制而改变),最终得到一个O(n²)的大O。
那么这与上面简单的两个for循环具有相同的大O?是的!大O帮助计算机科学家可视化算法运行时间的上限,所以就所有目的而言,这两种不同的算法具有相同的 大O 。
下面是一些不同的大O复杂度的相互比较:
现在我们对时间复杂度有了一定的了解,我们终于可以看看研究 判定问题( decision problems) 的P和NP了。判定问题是一个有答案 "真 "或 "假 "的问题。
P:P代表多项式,是两者中比较简单的 。P类可以被描述为可由算法在多项式时间内解决的问题的集合。
NP:NP代表非确定性多项式,这是两类中比较复杂的 ,它有两种不同的可能定义。更简单的定义是。
在计算复杂性理论中,NP(非确定性多项式时间)是一个用于对决策问题进行分类的复杂性类。NP是一组决策问题,对于这些问题,答案是“是”,它的证明可以在多项式时间内被确定性图灵机证明。
NP (Nondeterministic Polynomially,非确定性多项式)类问题是指一个复杂问题不能确定是否在多项式时间内找到答案,但是可以在多项式时间内 验证答案是否正确。
最好是看一个经典游戏来帮助直观地了解NP问题。
例子:数独
数独是我用来描述NP中问题类别的最常用的例子。
数独是很容易解决的,所以上面的算法并没有花费多少时间来解决它。然而,如果这个数独谜题从9x9增长到100x100呢?如果我们把数独问题从9x9的输入,概括为采取NxN,那么这个问题很快就会变成一个NP问题。
数独问题是很容易 验证的 。这意味着,给定一个数独问题的解,存在一个多项式时间的算法,可以正确验证该解是否正确。
再次使用这个9x9的例子,你自己可以很容易地验证这是否是一个正确的解,并且设计一个算法来完成你自己的大脑在这种情况下所能完成的工作也是很简单的。然而,要解决任何大小的数独谜题的算法似乎就不那么简单了,这也是事实。
更深入的研究:NP的完备性(完全性)
与NP相关的问题是NP的完备性问题。这些问题因其难度而闻名,因为它们没有已知的多项式算法解(O(n), O(n^2)...)。这些问题可以被认为是计算机科学中最棘手的问题。
确定一个问题是否是 NP-完备性 的过程如下。
NP-Hard:当事情从复杂变成更复杂。
NP-Hard问题的定义如下:
非正式地讲,NP-Hard问题与任何NP问题一样难或更难。更确切地说,任何NP-完备性问题都可以在多项式时间内简化为NP-Hard问题。
解决一个NP-Hard问题的算法可以解决所有的NP-Hard问题,因为每个NP-Hard问题都可以被转化成其他问题。这意味着解决一个NP-完备问题的方案也能解决所有其他NP-完备问题。
同样值得注意的是,一个NP-Hard问题不一定在NP中(记住),如果它既是NP-Hard又在NP中,我们会把它归类为NP完备,而且不一定是判定问题。
例子:路径与总和
哈密顿路径问题( Hamiltonian Path problem ) 问的是对于一个给定的图,是否有一条路径只访问每个顶点一次。
哈密尔顿路径问题是一个 NP完备性问题 的例子。要验证这个问题是否在NP中很简单。
子集和( Subset Sum problem ) 问题是,给定一个包含整数的集合 S 和一个 目标和( target-sum ) N,确定S中是否有一个子集的总和为 N 。
这个问题也是NP完备的。要验证这个问题是否属于NP,比上一个问题还要简单:
也许你很难相信,但是 子集和问题 和 哈密顿路径问题 在函数上是等价的,因为它们都是NP-完备的。这意味着子集之和的解决方案可以转化为解决哈密尔顿路径问题。有大量的NP-完备问题,这只是其中两个例子。
P是否等同于NP?
大多数数学家和计算机科学家会说,No。但我们还没有一个明确的证明。
重要的是要考虑到,P=NP只告诉我们存在多项式时间的解,而不是这些算法是什么。
然而,如果这些算法确实存在,而且问题被解决了,那么它不仅对计算机科学领域,而且对其他主要领域都会产生一些深远的影响:
其影响可能是巨大的,因为到最后,我们实际发现最可用的算法希望是O(n)或O(nlogn)和O(logn)--即使P=NP,如果算法是O(n^100),它也没什么实际意义。
这是一个我们仍在努力解决的问题,也是一个也许永远不会被解决的问题。