您的位置:首页 > 其它

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

2017-02-10 03:10 211 查看
这篇博客主要是解释一下我们平时在算法上用到的复杂度和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的算法。我们两种都试试。

polynomial certificate:假定给我们一个certificate,在这里就是一个数字k,我们要判断它是否小于n以及能否被m整除。所以运行的复杂度是O(1)(也就是定义中的running time),而certificate本身大小是O(lonn)。因此running time被input size bound住,整数分解是NP问题。

存在polynomial algorithm?: 现在我们试图解一下这个问题。就用最naive的算法,遍历[2,n]。那么算法复杂度是n,但是输入的大小呢?是O(logm+logn)(注意不是nlogm)。再特殊化,只考虑n≤m情况,也就是说这种算法的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进行映射,确定映射后的G′1和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是常数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 NP P complexity