P and NP

摘录的学习笔记

时间复杂度
多项式复杂度: O ( 1 ) , O ( l o g ( n ) ) , O ( n a ) O(1),O(log(n)),O(n^a) O(1),O(log(n)),O(na)
非多项式复杂度: O ( a n ) 和 O ( n ! ) O(a^n)和O(n!) O(an)O(n!) 其复杂度计算机往往不能承受。

当我们在解决一个问题时,我们选择的算法通常都需要是多项式级的复杂度,非多项式级的复杂度需要的时间太多,往往会超时,除非是数据规模非常小。


P问题:
一个问题可以在多项式 O ( n k ) O(n^k) O(nk)的时间复杂度内解决。P就是多项式的英文单词首字母


NP问题
一个问题的解可以在多项式的时间内被验证。
另一种定义方法:可以在多项式的时间里猜出一个解的问题,然后再去验证



很显然,所有的P类问题都是NP问题。也就是说,能多项式地解决一个问题,必然能多项式地验证一个问题的解——既然正解都出来了,验证任意给定的解也只需要比较一下就可以了。关键是,人们想知道,是否所有的NP问题都是P类问题。



NPC问题

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

NPC问题的定义非常简单。同时满足下面两个条件的问题就是NPC问题。第一,它得是一个NP问题;第二,所有的NP问题都可以约化到它。
证明一个问题是 NPC问题也很简单。先证明它至少是一个NP问题,再证明其中一个已知的NPC问题能约化到它(由约化的传递性,则NPC问题定义的第二条也得以满足;至于第一个NPC问题是怎么来的,看逻辑电路问题),这样就可以说它是NPC问题了。

逻辑电路: 一个逻辑电路由若干个输入,一个输出
在这里插入图片描述
这是个较简单的逻辑电路,当输入1、输入2、输入3分别为True、True、False或False、True、False时,输出为True。

有输出无论如何都不可能为True的逻辑电路吗?有。下面就是一个简单的例子。
在这里插入图片描述
上面这个逻辑电路中,无论输入是什么,输出都是False。我们就说,这个逻辑电路不存在使输出为True的一组输入。

逻辑电路问题属于NPC问题。这是有严格证明的。它显然属于NP问题,并且可以直接证明所有的NP问题都可以归约到它。证明过程相当复杂,其大概意思是说任意一个NP问题的输入和输出都可以转换成逻辑电路的输入和输出(想想计算机内部也不过是一些0和1的运算),因此对于一个NP问题来说,问题转化为了求出满足结果为True的一个输入(即一个可行解)。

既然所有的NP问题都能归约成NPC问题,那么只要任意一个NPC问题找到了一个多项式的算法,那么所有的NP问题都能用这个算法解决了,那么NP也就等于P了。因此,目前NPC问题还没有多项式的有效算法,只能用指数级甚至阶乘级复杂度的算法来解决,那么意思就是如果能够找到一个能用多项式时间复杂度解决的NPC问题就证明了P=NP了。问题是现在还没找到这样的算法嘛


NP-Hard问题

NP-Hard问题是这样一种问题,它满足NPC问题定义的第二条但不一定要满足第一条,就是说所有的NP问题都能归化到它,但它本身并不一定是个NP问题,也就是即使有一天发现了NPC问题的多项式算法,但NP-Hard问题仍然无法用多项式算法解决,因为它不是NP问题,对于答案的验证都很困难。

这些问题的关系,左图是现实,右图目前还是理想(得等到找到在多项式复杂度内可以求解NPC问题的算法)
在这里插入图片描述


摘录如下两位大神的文章:
http://www.matrix67.com/blog/archives/105
https://www.jianshu.com/p/cffe6217e13b

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值