P-NP 理论

1. Concepts

P: Polynomial,多项式

NP: Non-determinstic Polynomial,非确定性多项式

NPC: Non-deterministic Polynomial Complete:

2. Whats polynomial?

假设有一个自变量 n

n + n^2 + 3n^3 这就是一个多项式

2^n , n! 不是多项式,他们也有自己的名字:超多项式

一般而言,当 n 作为底数时,就是多项式,当 n 作为指数时或者阶乘时,就是超多项式。

3. Reducibility

简单地说,一个问题 A 可以约化为问题 B 的含义即是,可以用问题 B 的解法解决问题 A,或者说,问题 A 可以“变成”问题 B。

《算法导论》上举了这么一个例子。比如说,现在有两个问题:求解一个一元一次方程和求解一个一元二次方程。那么我们说,前者可以约化为后者,意即知道如何解一个一元二次方程那么一定能解出一元一次方程。我们可以写出两个程序分别对应两个问题,那么我们能找到一个“规则”,按照这个规则把解一元一次方程程序的输入数据变一下,用在解一元二次方程的程序上,两个程序总能得到一样的结果。这个规则即是:两个方程的对应项系数不变,一元二次方程的二次项系数为0。按照这个规则把前一个问题转换成后一个问题,两个问题就等价了。

“问题 A 可约化为问题 B”有一个重要的直观意义:B 的时间复杂度高于或者等于 A 的时间复杂度。也就是说,问题 A 不比问题 B 难。这很容易理解。既然问题 A 能用问题 B 来解决,倘若 B 的时间复杂度比A的时间复杂度还低了,那 A 的算法就可以改进为 B 的算法,两者的时间复杂度还是相同。正如解一元二次方程比解一元一次方程难,因为解决前者的方法可以用来解决后者。

很显然,约化具有一项重要的性质:约化具有传递性。如果问题 A 可约化为问题 B,问题 B 可约化为问题 C,则问题 A 一定可约化为问题 C。这个道理非常简单,就不必阐述了。

现在再来说一下约化的标准概念就不难理解了:如果能找到这样一个变化法则,对任意一个程序 A 的输入,都能按这个法则变换成程序 B 的输入,使两程序的输出相同,那么我们说,问题 A 可约化为问题 B。

当然,我们所说的“可约化”是指的可“多项式地”约化(Polynomial-time Reducible),即变换输入的方法是能在多项式的时间里完成的。约化的过程只有用多项式的时间完成才有意义。

4. p、np、npc、np-hard

1. P Problem

在多项式时间内可解的问题

2. NP Problem

首先,NP 问题不是指 Not Polynomial 问题,而是指 Non-deterministic Polynomial 问题。

毫无疑问提,如果 NP 中 N 的意思是 Not 的话,那为什么还要研究 P 是否等于 NP 呢?😀

事实上,Not 和 Non-deterministic 有很大的差别。前者表示明确的否则,而后者表达了一种不确定性,即我们不知道 NP 问题到底能不能在多项式时间内可解。

也可以将 NP 问题理解为可以在多项式的时间里验证一个解的问题。

如果一个问题都不能在多项式时间内验证,那就必然不可能在多项式时间内可解。

但这并不意味着 NP 问题可以在多项式时间内可解,在多项式时间内可验证和在多项式时间内可解没有任何关联。

之所以要定义 NP 问题,是因为通常只有 NP 问题才可能找到多项式的算法。我们不会指望一个连多项式地验证一个解都不行的问题存在一个解决它的多项式级的算法。

因此,显然的,所有的 P 类问题都是 NP 问题。也就是说,能在多项式时间内解决一个问题,必然能在多项式时间验证一个问题的解。

关键是,人们想知道,是否所有的 NP 问题都是 P 类问题?也即,是否有 P=NP?

通常所谓的 NP 问题,其实就一句话:证明或推翻 P=NP。

NP 问题很难解决,但现在有一个总的趋势,然们普遍倾向于认为:P!=NP,因为人们在研究 NP 问题的时候找到了一类特殊的 NP 问题叫做 NP-完全问题,也就是 NPC 问题。

3. NPC Problem

好了,从归约的定义中我们看到,一个问题约化为另一个问题,时间复杂度增加了,问题的应用范围也增大了。通过对某些问题的不断约化,我们能够不断寻找复杂度更高,但应用范围更广的算法来代替复杂度虽然低,但只能用于很小的一类问题的算法。再回想前面讲的 P 和 NP 问题,联想起归约的传递性,自然地,我们会想问,如果不断地归约上去,不断找到能“通吃”若干小 NP 问题的一个稍复杂的大 NP 问题,那么最后是否有可能找到一个时间复杂度最高,并且能“通吃”所有的 NP 问题的这样一个超级 NP 问题?答案居然是肯定的。也就是说,存在这样一个 NP 问题,所有的 NP 问题都可以约化成它。换句话说,只要解决了这个问题,那么所有的 NP 问题都解决了。这种问题的存在难以置信,并且更加不可思议的是,这种问题不只一个,它有很多个,它是一类问题。这一类问题就是传说中的NPC 问题,也就是 NP-完全问题。NPC 问题的出现使整个 NP 问题的研究得到了飞跃式的发展。我们有理由相信,NPC 问题是最复杂的问题。

NPC 问题的定义非常简单。同时满足下面两个条件的问题就是 NPC 问题。

  • 首先,它得是一个 NP 问题
  • 然后,所有的 NP 问题都可以约化到它。

证明一个问题是 NPC 问题也很简单。先证明它至少是一个 NP 问题,再证明其中一个已知的 NPC 问题能约化到它(由归约的传递性,则 NPC 问题定义的第二条也得以满足;至于第一个 NPC 问题是怎么来的,下文将介绍),这样就可以说它是 NPC 问题了。

既然所有的 NP 问题都能约化成 NPC 问题,那么只要任意一个 NPC 问题找到了一个多项式的算法,那么所有的 NP 问题都能用这个算法解决了,NP 也就等于 P 了。因此,给 NPC 找一个多项式算法太不可思议了。因此,前文才说,“正是NPC 问题的存在,使人们相信 P≠NP”。我们可以就此直观地理解,NPC 问题目前没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的搜索。

4. NP-Hard Problem

顺便讲一下 NP-Hard 问题。NP-Hard 问题是这样一种问题,它满足 NPC 问题定义的第二条但 不一定 要满足第一条(就是说,NP-Hard 问题要比 NPC 问题的范围广)。

NP-Hard 问题同样难以找到多项式的算法,但它不列入我们的研究范围,因为它不一定是 NP 问题。即使 NPC 问题发现了多项式级的算法,NP-Hard 问题有可能仍然无法得到多项式级的算法。事实上,由于 NP-Hard 放宽了限定条件,它将有可能比所有的 NPC 问题的时间复杂度更高从而更难以解决。

5. 逻辑电路问题

这是第一个 NPC 问题。其它的 NPC 问题都是由这个问题约化而来的。因此,逻辑电路问题是 NPC 类问题的“鼻祖”。

参考

知乎:什么是多项式?

Matrix67: 什么是P问题、NP问题和NPC问题

posted @ 2025-05-25 18:24  光風霽月  阅读(33)  评论(0)    收藏  举报