千禧年七大数学问题之——“NP=P”的猜想和NP类问题的解决方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

计算机算法中常会碰见一个很有意思的问题“NP=P”,时至今日,还没有哪位学者能够给出确定性的结论,但是计算复杂度理论的学者普遍认为NP≠P

我的解释和说明很通俗话,旨在大家都能看懂,因为看懂才能思考,所以没有什么专业名词,就算有也会做详尽的解释,希望大佬见谅!


“NP=P”是什么?

要知道“NP=P”是个什么问题,先要知道什么是“P类问题”,什么是“NP类问题”。
举个例子

P类问题

计算n个连续自然数的和,如果使用最直接而笨拙的方法,需要计算n-1次加法,那么可以认为这个算法的时间复杂度就是“n-1”,记作O(n-1)或者O(n)。之所以可以记作O(n),是因为随着n的增大,1这个常数就忽略不计了。
例如:计算1,2,3,4的和
过程:

1+2=33+3=66+4=10

一共4个数,计算了4-1次

如果是3到9的和,7个数就会计算7-1次
n个数就是n-1

又或者给你100个数,找到等于10的数,这个简单吧,算100遍就行了

NP类问题

如果要把n个不同的自然数排序,那么就需要对这些自然数的大小进行比较。我们也采用最笨拙的算法,也就是将每两个自然数都做一次比较,那么需要比较n(n-1)/2次,记作O(n²/2)
例如:对3,2,1,4排序
过程:

第一位和第二位比较 3>2 交换32位置 2,3,1,4
第一位和第三位比较 2>1 交换21位置 1,3,2,4
第一位和第四位比较 3<4 位置不变     1,3,2,4
第二位和第三位比较 3>2 交换32位置 1,2,3,4
到这里我们人肉眼可以看出来顺序对了,但计算机不认识,所以他还会继续比较,用我的话来说就是他还想确认下。。。
第二位和第四位比较 2<4 位置不变     1,2,3,4
第三位和第四位比较 3<4 位置不变     1,2,3,4

4个数,计算了6次
如果是3到9的连续自然数,打乱了顺序,7个数会计算多少次呢?
用公式算下就知道了,7x(7-1)=21,需要计算21次
还有很多很多NP,网上搜一下就知道了,我就不举例了

小结

小结一下,就是P类问题,n个待处理的数据,只需要n次就能处理完
NP类问题则是,有n个待处理数据,但以“目前”的算法,额,通俗点说是以"目前"的处理方式,不能在n次内处理完成,可能需要2n次,3n次,n*n次,甚至n^n次或者更多,注意,我叠的甲"目前",如果未来这个问题解决了,能逆推因果,应该就能解决吧。

而证明NP=P,则表示,所有NP类问题,都有存在至少一个算法,能够n次就处理完成

更正式一些的说明:参考https://baike.baidu.com/item/NP/7470332?fr=aladdin
P表示为nk,假设w是我们的数据,C为计算方式,则n为次数即w数据的长度、个数,k为C计算方式一次的步数
NP中P为上面解释的意思,而N为算法的效率

思考

用反证法,仍然上面的排序问题举例
我简化点问题,给定n个不重复的乱序自然数,并且在他们排序后是从0开始的连续的自然数,请给这个乱序自然数排序。

我们可以这样处理,有个盒子,盒子中正好有n个格子,并且格子编号了序号,从0开始的连续自然数的序号。
那我们只需要每次取一个数放到对应的序号的格子中不就行了?( ps,可能有算法基础的会说,既然这样直接打印从0到size-1的数就行了,如果自然数换成其他的实体呢。。。我先提前扛一下(^_^) )
这P类问题

有意思的地方就在这儿,如果有100万个数据,你能不进行查找比较,直接放到对应的格子里吗?
比如,是我的话,放编号6666的数字,我会在100万格子的前面部分开始找,可能第一次找到5000的格子,那我再往后跳,又找到7000的格子,那再往前,以此类推,最终再定位到指定的格子。
把数字放到对应的格子也是P类问题
NP可以拆吗?

所以如果证明NP=P的话,就表示,有种算法,或者有种方式,能够每次一找,一放就能把数字放到指定的格子中。

所有的NP类问题的共性就是无论其是否能够在多项式时间复杂度内求解,至少我们知道如果随便给出一个可能的解,我们可以在多项式时间复杂度内验证其是否为所求的解。大量重复的计算,而我们计算机中就有这种处理大量重复的计算的硬件–gpu,并且ai也是基于gpu的并行计算实现,所以,在此基础上,我们是否可以引入一个新的变量,类似于gpu的并行计算方式,

解决方案

(ps:上面小结有解释说明P=nk)

定义并行计算组方法在这里插入图片描述为D,使D等于w数据的个数,D=n,则每个D中变成了,给定一个答案,在多项式时间复杂度中求解,由于是D并行计算,则耗时为C的运行步数,则为k。此时C既是计算方式,也是P类问题,C=P
C的运行步数k也等于P的运行步数,k=P
可写作:NP=D( P)
D( P)=D(k)
NP=D(k)

NP类问题可以在P的nk中,k步内解

同理:P类问题也可以用并行计算处理
P=nk,
n=D,
P=D(k)

因为NP=D(k)同时P=D(k)
所以NP=P

同时NP=D(D(k))

解释:
一个计算方式进行计算是需要时间的,比如上面的排序,计算方式就是取一个数到盒子里,从零开始一个个比较,如果对了,就放进对应的盒子里,计算一次一个数放的位置的时间就是k,有几个数就放几次,是n,n * k 是一共需要的时间。用并行计算的方式,就是有很多人同时来处理所有的数字,同时拿数同时找位置同时放,所以不管有几个数都是同时进行,这里运行时间为1 * k一次代码所用的时间。这种处理方式我用D()表示括号里带入计算一次所需要的时间k,所以NP=D(k)
而我们说的P类问题也可以用并联的方式解决,比如把一个数放到对应盒子里,计算方式就是每个盒子比较一次,对就放进去,不对就不放,比较一次后放或不放所用的时间k,有几个格子就计算几次,也是n * k 一共所需要的时间,并行计算则,每个盒子安排个人看守,来了个数字同时比较,然后决定放或不放,同时进行所需时间则为1 * k ,所以P=D(k)

说明:我这仅仅是解决方案,因为NP问题原题中还有要求是可以由一个确定型图灵机(单核单线程)
并行计算则是多个确定型图灵机并行运行。
如果是按原要求的话,那我的计算方式好像也有点说法(^_^)如果把里面的计算方式看成是一个C的话,则是个P类问题,如果里面还要拆的话,就是个时间复杂度(n*n)的lj算法了。。。

由上解决方案,由于D可以自定义,所以,当D=w.size/2时,Nnk=D(2k),则2k的步数时间内解决NP问题

未来服务器可能就不止现在的架构,可能会有类似于gpu的能够支持大量并行运算的组件,或者支持大量并行的云计算,毕竟可以解决np问题以及ai都会用到。

but,此观点仅个人看法,希望更多人思考:

我在边写这篇文章的时候也在边思考,反思,我想到日常生活中很多孰能生巧的例子,有很多类似直觉的事情发生。可能就会有人能在一定范围类的数量级里,每次都能放到指定的格子中。所以我理性告诉我,可能np≠p,但感性中觉得np=p,可能钥匙就藏在类似的事物中。


最后

我比较希望 NP=P 证明成功的,毕竟科技要向前发展,而很多人担心安全问题,我们担心啥?世界不会因哪个人的担心而停转,有问题去解决,解决不了就先做个保底方案,至少怎么做才能损失降到最低,比白担心好吧。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值