文章标题

来源:互联网 发布:夺命追魂call软件 编辑:程序博客网 时间:2024/06/07 23:33

通俗详细地讲解什么是P和NP问题

上篇博文谈及NP,有博友认为我文中没有解释NP的概念,是不妥的,这次对P和NP进行详细的讲解,使得非计算机专业的理工类也能看懂,计算机专业的当然就更能透彻地看懂了。

要计算或解决一个问题,该问题通常有一个大小规模,用n表示。例如,若分析计算一个二进制数,该数有多少位,这个位就是其大小规模。再比如,从n个数里面找出最大的那个数,这个n就是该问题的规模大小。怎么找?我们要比较n-1次才能得到结果,这个n-1就是所花的时间,也就是时间复杂度。再比如,将n个数按从大至小排序,n是其规模大小,若是我们按这样的方法:第一次从n个数里找最大,第二次从n-1个数里找最大,以此类推,需要的比较次数就是n(n-1)/2,称我们所用的方法为算法,称n(n-1)/2为该算法的时间复杂度。对于时间复杂度,当n足够大时,我们只注重最高次方的那一项,其他各项可以忽略,另外,其常数系数也不重要,所以,n(n-1)/2我们只重视n的平方这一项了,记为O(n的平方),这就是该算法对该问题的时间复杂度的专业表示。

所有形如a*n^k+b*n^(k-1)+c*n^(k-2)……都可记为O(n^k), n^k表示n的k次方,*为乘号,这样的复杂度称为多项式时间复杂度,若是时间复杂度形如k^n,k为大于1的常数,或n!,或更大的,就称为指数型时间复杂度。显然,当n足够大时,指数型时间比多项式要大得多的多。

所有能用多项式时间算法计算得到结果的问题,称为多项式问题,也就是P,所有绝对不可能用多项式时间求解的问题,称为指数型问题。

有这样一类问题,假使你得到了问题的解,我要验证你的解是否正确,我验证所花的时间是多项式,至于求解本身所花的时间是否是多项式我不管,可能有多项式算法,可能没有,也可能是不知道,这类问题称为NP问题。

NP概念的奥妙在于,它躲开了求解到底需要多少时间这样的问题,而仅仅只是强调验证需要多少时间,从而为P与NP这一千年难题的产生埋下了伏笔。显然,P肯定是NP,因为你既然能用多项式求解,就肯定能用多项式验证(难不成我再算一遍!),但NP是否是P谁也确定不了。另外,目前已经很明确的指数型问题也肯定不是NP。当然要理解这一点还有点难,看我下面的解释。

讲到目前为止,NP的概念还是抽象的,听者恐怕还没有达到透彻掌握的程度。要是我给学生讲课的话,对这样抽象难理解的概念,我会告诉学生用如下方式去透彻的掌握它(呵呵,但愿我不要是那种自己仅停留在背概念的水平,甚至连概念都没有理解透,却要厚脸皮地自吹自己“讲课水平高”的人了,我的逻辑非常简单,我自己曾经用这样的方法高效透彻地掌握了,我让学生按这样的方法去做,他们也能达到高效而透彻):

1,找三个例子,一个为P,一个为NP但不知道是否为P,再一个为明显的指数型问题比如全排列、汉诺塔等,反复比较理解。
2,尽可能多的找出NP问题的特点,哪怕有重叠也没关系,针对每一个特点,结合例子去理解。NP最显著的特点有两个,一个是分步及每一步的并行性,二就是任何NP问题都可转化为是和否的问题,当然,最根本的还有验证多项式。

当然我也会详细的总结出特点,细细的准备相应的例子,但这里就没有必要花这个时间笔墨了。

许多人由于没有理解P和NP的实质,仅仅只是背了一下其关于确定性和非确定性图灵机、语言、空间等概念,又没有理解透,将概念进行无谓的倒腾,以为仅凭这些概念的文字表述所指的范畴,就能得出P不等于NP的结论,莫非这些人真的以为粑粑不要米做?

本文引用地址:http://blog.sciencenet.cn/blog-327757-531546.html 此文来自科学网杜立智博客,转载请注明出处。

0 0
原创粉丝点击