您的位置:首页 > 其它

NP难题

2009-10-17 22:21 162 查看
NP: 
      Non-deterministic Polynomial的问题,也即是多项式复杂程度的非确定性问题。

NPC(NP完全理论):
     NP完全理论并不打算找到所谓的NP难题(也就是当前计算科学家还无法解决的问题)的算法,仅着眼证明这一类问题的等价性,即证明它们的困难程度相当。若其中一个问题找到多项式解法,则这一类问题全部解决(即都可以找到多项式解法)。同样。若能证明它们中间的任意问题没有好的算法,则全体都没有。
    (目前已经证明了NP难题的难度相当,比如顶点着色问题,独立集问题,有向哈密尔顿道路问题,背包问题(此背包不同于01背包)等)
    证明理论的难点回答猜想 P==NP?
    问题就在这个问号上,到底是NP等于P,还是NP不等於P。证明其中之一,便可以拿百万美元大奖。这个奖还没有人拿到。Mr. X信口开河敢说NP就是Non-Polynomial,真是不知天高地厚,惹人笑话。

NP难题:
      NP难题直观上将就是目前计算机科学家们现在没有找到有效算法可以解决的问题。比如上面提高的背包,哈密尔顿回路,TSP旅行商问题等。但是目前没有找到有效的算法不代表以后也找不到,所以NP难题到底是P(Polynomial),还是NP(Non-Polynomial),尚无定论。重申,只是目前表面看来,NP难题更像是NP,即数据量大的时候无法用计算机在多项式时间解决的问题。
      判断一个问题是否是NP难题,就看他的最好的算法的时间复杂度能否计算机承受。
      比如,就最短路径问题,最长公共子序列问题等,在使用了动态规划算法以后,都可以在多项式时间内求出。那么就不属于NP难题。(注意,假如现在人类还不知道动态规划,用穷举的方法来做,那么时间复杂度就是指数级的了,那么就意味着计算机无法承受,就属于NP难题了)
       再比如,TSP旅行商问题(也就是最短的哈密尔顿回路问题),其即使在采用了动态规划算法之后,其时间复杂度和空间复杂度仍然是n的指数规模,动态规划虽然提供了一种比穷举好的解法,但仍不是一种可行的算法。故TSP问题属于NP难题。
       还有一个前段时间困扰我的那个矩阵的不同行不同列的元素的最大和问题(本blog有专门一片文章讨论该问题)。想了许久没有好的解法,在采用了DP算法之后,发现复杂度仍然高的无法承受,今天明白了,其是个NP难题!

PS:由于小弟对上面的认识仍处在模糊阶段,故上面的东西可能存在错误。 不可尽信之!

参考:
http://baike.baidu.com/view/158424.htm
http://zh.wikipedia.org/wiki/P/NP%E9%97%AE%E9%A2%98

http://ks.cn.yahoo.com//question/1307030903771.html

首先说明一下问题的复杂性和算法的复杂性的区别,下面只考虑时间复杂性。算法的复杂性是指解决问题的一个具体的算法的执行时间,这是算法的性质;问题的复杂性是指这个问题本身的复杂程度,是问题的性质。比如对于排序问题,如果我们只能通过元素间的相互比较来确定元素间的相互位置,而没有其他的附加可用信息,则排序问题的复杂性是O(nlgn),但是排序算法有很多,冒泡法是O(n^2),快速排序平均情况下是O(nlgn)等等,排序问题的复杂性是指在所有的解决该问题的算法中最好算法的复杂性。问题的复杂性不可能通过枚举各种可能算法来得到,一般都是预先估计一个值,然后从理论上证明。
为了研究问题的复杂性,我们必须将问题抽象,为了简化问题,我们只考虑一类简单的问题,判定性问题,即提出一个问题,只需要回答yes或者no的问题。任何一般的最优化问题都可以转化为一系列判定性问题,比如求图中从A到B的最短路径,可以转化成:从A到B是否有长度为1的路径?从A到B是否有长度为2的路径?。。。从A到B是否有长度为k的路径?如果问到了k的时候回答了yes,则停止发问,我们可以说从A到B的最短路径就是k。如果一个判定性问题的复杂度是该问题的一个实例的规模n的多项式函数,则我们说这种可以在多项式时间内解决的判定性问题属于P类问题。P类问题就是所有复杂度为多项式时间的问题的集合。然而有些问题很难找到多项式时间的算法(或许根本不存在),比如找出无向图中的哈米尔顿回路问题,但是我们发现如果给了我们该问题的一个答案,我们可以在多项式时间内判断这个答案是否正确。比如说对于哈米尔顿回路问题,给一个任意的回路,我们很容易判断他是否是哈米尔顿回路(只要看是不是所有的顶点都在回路中就可以了)。这种可以在多项式时间内验证一个解是否正确的问题称为NP问题。显然,所有的P类问题都是属于NP问题的,但是现在的问题是,P是否等于NP?这个问题至今还未解决。注意,NP问题不一定都是难解的问题,比如简单的数组排序问题是P类问题,但是P属于NP,所以也是NP问题,你能说他很难解么?刚才说了,现在还不知道是否有P=NP或者P<>NP,但是后来人们发现还有一系列的特殊NP问题,这类问题的特殊性质使得很多人相信P<>NP,只不过现在还无法证明。这类特殊的NP问题就是NP完全问题(NPC问题,C代表complete)。NPC问题存在着一个令人惊讶的性质,即如果一个NPC问题存在多项式时间的算法,则所有的NP问题都可以在多项式时间内求解,即P=NP成立!!这是因为,每一个NPC问题可以在多项式时间内转化成任何一个NP问题。比如前面说的哈米尔顿回路问题就是一个NPC问题。NPC问题的历史并不久,cook在1971年找到了第一个NPC问题,此后人们又陆续发现很多NPC问题,现在可能已经有3000多个了。所以,我们一般认为NPC问题是难解的问题,因为他不太可能存在一个多项式时间的算法(如果存在则所有的NP问题都存在多项式时间算法,这太不可思议了,但是也不是不可能)。类似哈米尔顿回路/路径问题,货郎担问题,集团问题,最小边覆盖问题(注意和路径覆盖的区别),等等很多问题都是NPC问题,所以都是难解的问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 笑话 blog 优化 c