CMP设计分享 http://blog.sciencenet.cn/u/accsys 没有逆向思维就没有科技原创。 不自信是科技创新的大敌。

博文

我为什么敢说解决了P与NP问题?

已有 10277 次阅读 2015-6-23 08:41 |个人分类:科研讨论|系统分类:科研笔记| 子集和问题

我为什么敢说解决了PNP问题?

姜咏江

   P/NP问题号称世界第一难题,我有什么底气敢说自己解决了这个问题,敢作出P=NP的结论?理由很简单。

1.              设计出了通用子集和软件

   关于子集和问题的学术地位,在Introduction Algorithms这本书的1078页有介绍(见1)。

1  子集和问题的学术地位

3中标注部分翻译成中文:34.4节和34.5节中完全性证明的结构,所有的证明都是通过对CIRCUIT-SATNP完全性归约得到的

   据说图3这棵树分支上的任何一个问题都是NPC问题,任意一个NPC如果找到了通用的解法,并且是多项式时间内完成的,那么就可以下结论:P=NPC,即有P=NP

   我设计的BuildSubset_Sum软件可以完成对任意有限整数集(可以在数的定义上加上小数)的子集求和。例如图2,用菜单BuildSet/CreateSet随便输入17个数(几个都可以),就可以在程序出现ok!之后通过GuessCheck菜单输入任意整数,就可以找满足条件的子集。如果有,系统就会列出来,没有会显示没有的提示。

2  子集和软件使用

2.              多项式时间复杂度

   我们已经设计出了满足要求的子集和程序,但这个程序是否满足所谓多项式时间复杂度?这个问题需要分为两部分来考虑。

2.1         建立全部子集时间

   给定n个数形成的集合,它的子集共有2n个,这是人们都知道的。问题是这2n个子集能够一一建立起来吗?建立的程序运行时间如何表示出来?这与选择什么样的算法来设计程序有很大关系。子集和subset_sum问题可以如下描述:

   设n元数集A={ x1,x2,x3,....,xn }y是某给定的数,求BAB的元素和为y

对于象n元的subset_sum这种函数,表面上看可以用下面的(1)式简单表达,可实际上解起来十分困难。

       y=a1x1+a2x2+a3x3+....+anxn                       1

其中ai值为01i =1,2,...,n。由于我们探讨的是有限集合,而且集合不允许出现重复元素,所以还必须设定,当ij,则xixj

   由于xi并不是有规律变化的,并且n的值并不确定,所以用(1)式难以准确计算。如果采用循环取值并判定ai值是否为0,这样循环的次数会接近nn,可见计算起来将会多费时间。如果将xi由小到大排列起来,也需要接近n!次循环。由此可见,用公式(1)进行计算并不是好方法(参阅http://blog.sciencenet.cn/blog-340399-849597.html)。

   关于子集和问题,我已经在几个月前设计出了用添加元素的方法,逐一得到所有子集的算法程序,其要点是从空集开始,每增加一个数,都将原有的所有子集添加上这个数,这样就得到了新增加后的全部子集,并在新子集中确定是否存在满足要求的集合(该程序方法我已经公布在科学网的博客http://blog.sciencenet.cn/blog-340399-849040.html中)。这个问题每增加一个数,那么子集数就会增加一倍。因为n个数的子集共有2n个,当n变为n+1时,子集数就到了2n+1=2×2n个。

   用公式(1)方法设计程序,就要形成将形成nn次循环嵌套;用元素添加方法设计程序,就形成了2n次循环操作调用。这说明采用不同的算法,即使是相同的输入也会直接影响到了循环嵌套的层次数及循环次数。

2.2         子集和的判定时间

   因为算法时间复杂度涉及到时间问题,这里我们自然要问:“建立有限集的全部子集要用多少时间?”

我为了读者易懂,这里采用非计算机专业化的叙述。

如果假设每添加一个元素所需的时间相同,于是得到n个元素的全部子集所需时间应是t=2+22+…+2n

由于n是有限整数,故得到全部子集所需时间t就是一个多项式时间。

   剩下来的问题:如果要查找子集和是否是给定的数需要多少时间呢?

   我们假定n个数的加法用一个单位时间,不妨就设是添加元素操作的a倍,那么2n个子集求和与比对给出的数,也不会超过a2n个单位时间。

   这样在即使没有建立子集的情况下,判定一个数会不会是某个数集的子集和,也不过要用2+22+…+2n+a2n个单位时间而已。

3.              算法时间复杂度的大o表示不靠谱

   关于用多项式最高阶项来确定算法时间复杂度的不靠谱,我们来举一个例子。一个算法的时间如果是一个多项式12+22+32+...+ n2所表示的,那么前n-1项和与第n项之差为:

Sn-1- n2=12+22+32+...+(n-1)2 - n2=12+22+32+...+1+ ( n-2)2 -2n

由此可知,当n>4时,就有Sn-1- n2 > 0。由此可见,只用多项式的最高阶项说明算法时间复杂度的误差有多大。

   有人说O(nk)O(cn)大不相同,其实可以将O(nk)变成O(10km)m也是一个整数变量。可见O(nk)O(cn)并无本质不同(见http://blog.sciencenet.cn/blog-340399-898296.html)。

4.              结论

   所谓的算法多项式是由多个只有乘法运算的项(包括整数幂)求和的表达式组成的。例如

 

 

等都叫多项式,它们之间可以相互转换。

在此多项式意义之下P=NP

为解答网友对2+22+…+2n的认识,补充:

 t=2+22+…+2n=11....10 是一个n+1位的二进制数。于是所谓O(2n)就是O(t)。这是将所谓指数多项式转为底数多项式的一个例子。

 

子集和问题软件下载:BuildSubset_Sum.rar

2015-06-23

 

 

 

 

 



https://blog.sciencenet.cn/blog-340399-899932.html

上一篇:为有限元线性过程计数原理所做的图解
下一篇:科学研究领域没有独到见解至多是个好学生
收藏 IP: 114.111.166.*| 热度|

2 孟凡 icgwang

该博文允许注册用户评论 请点击登录 评论 (21 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-11-24 10:49

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部