关于P、NP问题和算法的一点联系

时间:2021-08-15 23:52:56

这篇博客主要是解释一下我们平时在算法上用到的复杂度和NP还有P的联系,以及为什么第一反应是P的限制整数分解问题竟然只能“神奇的”确定是NP问题,而不一定是P,以及由此展开的对其它问题的一些分析。

基本概念

知乎上对P和NP有非常详尽的解释,从图灵机展开的很多概念,我就不在此复制粘帖了。只需要有一个大的概念:问题主要分为NP和NP-hard;对于NP问题,有一部分问题是P的,有一部分是不确定P还是NP-Complete,最后一部分是和NP-hard的交际,叫做NP-Complete问题,而NP-Complete有一个特性,是彼此相互polynomial reducable.

首先是polynomial algorithm(多项式算法)定义:

An algorithm is said to solve a problem in polynomial time if its running time is polynomially bounded by the encoding size of the input.

The running time is measured as the number of arithmetic operations carried out by the algorithm. It is a function f defined on the set of instances.
The encoding size of the input is a function g defined on s.

总结一下,就是在theory中,多项式算法的定义是算法运算数目(也就是我们平时在ACM算法中最常用到的时间复杂度)由输入数据的大小bound住,那么这就是一个polynomial algorithm。

P问题定义:

A decision problem is in the complexity class P if there exists a polynomial algorithm to solve it.

NP问题定义

NP is the class of decision problems for which the ‘yes’-answer has a certificate that can be checked in polynomial time.

P和NP问题一起来讲。首先二者都是决策问题:比如是否存在一个解 x 符合条件 c 。其次,如果对于某一个问题,能找到一个polynomial algorithm解决它,那么它就符合P问题的定义,也符合NP的定义,因为至少我们可以把某一个certificate用这个polynomial algorithm代入验证,那么这个certificate就能在polynomial时间内检测是否成立。certificate是一个抽象概念,我比较偏向于理解为是一种非常general的解集,然后算法需要对它进行检测是否为yes。

限制整数分解(bounded integer factorization)是P?

限制整数分解就是给定一个整数 m ,然后判断它是否有 k[2,n] 的因子。

如果按照以往算法竞赛的思路,最naive的算法也就遍历一遍 [2,n] O(n) ,所以是P问题。然而事实真的是这样么?

重新回到我们对于NP问题的定义。证明一个问题是NP有两种思路,1. certificate可以在polynomial内解决, 2. 能够想出一个polynomial的算法。我们两种都试试。

  1. polynomial certificate:假定给我们一个certificate,在这里就是一个数字 k ,我们要判断它是否小于 n 以及能否被 m 整除。所以运行的复杂度是 O(1) (也就是定义中的running time),而certificate本身大小是 O(lonn) 。因此running time被input size bound住,整数分解是NP问题。
  2. 存在polynomial algorithm?: 现在我们试图解一下这个问题。就用最naive的算法,遍历 [2,n] 。那么算法复杂度是 n ,但是输入的大小呢?是 O(logm+logn) (注意不是 nlogm )。再特殊化,只考虑 nm 情况,也就是说这种算法的running time不能被input size给bound住。因此此路不通。其他的算法,比如遍历条件变成 [2,min(m,n)] 并没有改变这个结论。(筛法的证明可以留给大家)

至少目前已知的整数分解算法,都还没有polynomial time solvable的算法,只不过有复杂度是 O(n) 甚至更小的,这二者并不等价。考虑清楚这一点,就能够理解为什么整数分解是NP,但是不是P还未知。

再深入想一想,为什么我们知道的那么多问题都是P的,尤其是算法竞赛,比如最短路问题(非负边)。因为输入的大小不一样。在整数分解中,我们只有一个输入;在限制的整数分解中,有两个输入。大小都是 O(logm) 级别的。但是在很多其他算法中,输入都是 O(n) 或者 O(n2)

其他NP问题

现在大部分NP问题都能划归到P或者NP-Complete问题。只有少数例外,比如

  • Integer Factorization
  • Graph Isomorphism
  • Nash Equilibrium

这里我再证明一下异构图是NP问题。

异构图判定

问题描述:给定两个图 G1,G2 ,判定两个是否为异构。

因为直接想solution,都是 n! ,在输入为 O(n2) 的情况下,不是polynomial solution。所以我们直接考虑证明certificate。

这个问题的certificate是一组下标 {i1,i2,...,in} ,输入大小为 O(nlogn)
1. 首先检查certificate是否是 {1,2,...,n} 的排列组合。时间复杂度为 O(n)
2. 然后将第一张图按照certificate的mapping进行映射,确定映射后的 G1 G2 完全一样。时间复杂度是 O(n+E)
所以时间复杂度是 O(n+E) ,而问题的输入是 O((n+E)log(n)) 。注意的是判断一个certificate是否为polynomial,是判断certificate的运行复杂度是否能被整个问题的input size给bound住。

另外关于bound, n2 是能够被 nlog(n) bound住的。因为根据定义,可以定义polynomial的 g 函数为 g(x)=x2 ,那么 n2 能够被 g(nlog(n)) bound住。换句话说,任意的polynomial运行复杂度都能够被非常数的polynomial input size给bound住。而bounded integer factorization之所以无法证明是否为P,就是因为input size是常数。