NP问题浅谈

之前在看相关算法和一些paper的时候,经常会出现NP-Hard这个词。之前一直迷迷糊糊,可是这么个东西一直在眼前晃来晃去还是挺难受的,我们要去解决问题而不是逃避问题。so,咱们就来看看这个NP-Hard问题,怎么用最简单的方式去了解。

1.世界七大数学难题之首

2000年,美国克莱数学研究所公布了世界七大数学难题,又称千禧年大奖难题。其中P与NP问题被列为这七大世界难题之首,从而大大激发了对这一问题的研究热情。

普林斯顿大学计算机系楼将二进制代码表述的“P=NP?”问题刻进顶楼西面的砖头上。如果证明了P=NP,砖头可以很方便的换成表示“P=NP!”。
康奈尔大学的Hubert Chen博士提供了这个玩笑式的P不等于NP的证明:
反证法。设P = NP。令y为一个P = NP的证明。证明y可以用一个合格的计算机科学家在多项式时间内验证,我们认定这样的科学家的存在性为真。但是,因为P = NP,该证明y可以在多项式时间内由这样的科学家发现。但是这样的发现还没有发生(虽然这样的科学家试图发现这样的一个证明),我们得到了矛盾。(上面内容来自wiki百科)

以上纯属玩笑,仅是为了说明这个问题是受到学术界极大关注的。

2.算法复杂度

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

上面这段描述,估计大家都能看懂,就不在啰嗦了。重点在下面,前方高能预警,大家注意了。

所有形如 a ∗ n k + b ∗ n ( k − 1 ) + c ∗ n ( k − 2 ) + ⋯ a∗n^k+b∗n^{(k−1)}+c∗n^{(k−2)}+⋯ ank+bn(k1)+cn(k2)+都可记为 O ( n k ) O(n^k) O(nk) n k n^k nk n n n k k k次方, ∗ * 自然就是乘法了,这样的复杂度为多项式(polynomial)时间复杂度。若是时间复杂度为 k n k^n kn k k k为大于 1 1 1的常数,或者 n ! n! n!的时间复杂度,或者比 n ! n! n!更大的时间复杂度 ,就称为指数型时间复杂度。显然,当 n n n足够大时,指数型时间比多项式要大得多的多。

3.P问题与NP(Non-deterministic Polynomial )问题

所有能用多项式时间算法计算得到结果的问题,称为多项式问题,也就是P问题。所有绝对不可能用多项式时间求解的可解问题,称为指数型问题。当然,还有一类问题属于不可解问题,也就是说你无论花多少时间也不能得到解答。

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

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

用通俗的话来解释,NP问题就是其解的正确性很容易被检验出来,这里的很容易检验指的是存在一个多项式算法。

4.最具代表性的NP-Hard问题:TSP

售货员旅行问题 (traveling salesman problem),是最具有代表性的NP问题之一。假设一个推销员需要从香港出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。现在假设公司只给报销 C 块钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?

推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排! 这将是个天文数字。

这个天文数字到底有多大?目前的方法接近一个一个的排着试,还没有找到更好可以寻得最短路径的方法。对七个城而言,共有 6 ! = 720 6!=720 6!=720 个排法,还比较简单;,但若有 20 20 20 个城,则排法就有 19 ! 19! 19! 种。因故在排列组合里 n ! n! n! 写起来轻松。但 1.21 ∗ 1 0 17 1.21∗10^{17} 1.211017 是一个大得不得了的数字。若每秒钟排一次,要排 3.84 ∗ 1 0 9 3.84∗10^9 3.84109 年(一年约为 3.15 ∗ 1 0 7 3.15∗10^7 3.15107秒),即使使用计算器,每秒排一百万次(不容易做到)也得重做三千年才能找到答案。「生也有涯,知也无涯」,想不到区区二十个城,要三十个世纪才能找到答案。

说到这里为止,童鞋们应该对NP问题有个大致的了解了吧!这里就只简单介绍下概念,如果有兴趣深入了解,建议再去自行搜多其他详细资料吧。

done~

References

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值