首页 > 代码库 > P和NP问题
P和NP问题
什么是P,什么是NP问题?
看论文的过程中,经常出现P=NP或者P!=NP问题,经常困扰着我,让我无时无刻想去搞懂到底什么是P,什么是NP。P(polynomial)P就是能在多项式时间内能够解决的问题。NP(Non-deterministic polynomial)也就是非确定的多项式,即是难解问题。那么第二个问题将会围绕着什么是多项式时间,这是什么东西?
多项式时间?
在研究算法的时间复杂度时,我们通常用O(nk )来表示。其中n是问题的规模,k是一个非负整数。一些科学家指出只有多项式时间算法才称得上是"好"算法。其实多项式时间复杂性也并不意味着较低的时间要求,如(n1000 ),他们的值依然大的惊人。至于科学家为什么要用这个标准去定义它,我们搞算法无需关注,不是重点。通常人们将存在多项式时间算法的问题成为易解问题,将需要在指数时间内解决的问题成为难解问题,目前证明的难解问题只有两类:不可判定问题和非决定的难处理问题。
什么不可判定问题和非决定的难处理问题?
不可判定问题:他们太难了,以致于根本不存在能求解它们的任何算法。非决定的难处理问题:这类问题是可判定的(即可解的)。但是即使使用非决定的计算机也不能在多项式时间内求解它们。
什么是确定算法,什么是不确定算法
设A是问题II的一个算法。如果在处理问题II的实例时,在算法的执行过程中,每一步只有一个确定的选择,则称算法A是确定性算法。因此,确定性算法对于同样的输入实例一遍一遍地执行,其输出从不改变。通常在写程序时,用到的都是一些确定性算法,比如查找和排序算法。
非确定算法包含两个阶段:猜测和验证阶段。设A 是求解问题II的一个算法。对于规模为n的输入实例L,生成一个输出结果S,把它作为给定实例L的一个候选解,该解可能是相应的输入实例L的解,也可能不是,甚至完全不着边际。但是它能够以多项式时间内能够输出这个结果。那么在验证阶段需要一个确定性算法来验证,把L和S都作为该算法的输入,如果s的确是L的一个解,算法停止且输出是,否则输出否。
P类问题和NP类问题的关系?
P类问题是可以用多项式时间的确定性算法来进行判定或求解
NP类问题可以用多项式时间的不确定算法来进行判定或求解,关键是存在一个确定算法,能够以多项式的时间来验证在猜测阶段所产生的答案。
直观上理解:P类问题是在确定性算法下的易解问题,而NP问题是非确定性计算模型下的易验证问题。因为确定性算法只是不确定算法的一种特例,显然有P NP,再者,通常认为,问题求解难于问题验证,故大多数研究者相信NP类是比P类要大得多集合,即是P! NP,故P!=NP。可是还没有任何人证明:在NP类中有哪个问题不属于P类。即P=NP?,但是后来人们发现还有一系列的特殊NP类问题,这类问题使得大多数科学家相信P!=NP,这类特殊的问题就是NP完全问题。
NP完全问题与NP 问题之间的关系?
1. 解决了这个问题我们就解决了所有NP问题
2. 这个问题本身也是个NP问题
本文出自 “简答生活” 博客,请务必保留此出处http://1464490021.blog.51cto.com/4467028/1914944
P和NP问题