答案 0 :(得分:11)
这不能证明P = NP。
你没有考虑正数的可能性:1,2,4,8,16等......所以你总和子集时不会有重复,所以它会在O(2)中运行^ N)在这种情况下的时间。
您可以将此视为一种特殊情况,但对于其他类似情况,该算法仍然不是多项式。你做的这个假设是你从NP完全版本的子集和去掉只解决容易(多项式时间)问题的地方:
当我们添加额外元素时,[假设正数的总和]以线性速率增长。
这里你实际上假设P(即陈述问题所需的位数)小于N.来自维基百科的引用:
因此,如果N和P具有相同的顺序,则问题最为困难。
如果您假设N和P具有相同的顺序,那么当您添加更多元素时,您无法假设总和无限增长。当您向集合中添加更多元素时,这些元素也需要变大,以确保问题仍然难以解决。
如果P(位置数的数量)是一个小的固定数,那么有动态编程算法可以完全解决它。
您已重新发现其中一种算法。这是一项很好的工作,但它不是新的东西,它不能证明P = NP。遗憾!
答案 1 :(得分:6)
死MG,
自你发布以来差不多半年了,但无论如何我都会回答。
Mark Byers写了大部分应该写的内容。
该算法是已知的。
这种算法被称为生成函数算法或简称为动态编程算法。
你的算法具有非常重要的特征,即所谓的伪多项式复杂性。
传统的复杂性是问题规模的函数。就传统复杂性而言,您的算法具有O(2 ^ n)悲观复杂度(对于数字1,2,4,......如前所述)
算法算法的复杂性可以表示为问题大小和问题中某些数字大小的函数。对于你的算法,它将类似于O(nw),其中w是不同总和的数量。
这是伪多项式的复杂性。这是一个非常重要的功能。尽管存在问题复杂性类,但这些算法可以解决许多现实问题实例。
Horowitz和Sahni算法具有悲观的复杂度O(2 ^ N / 2)。这不比你的算法好两倍,但是比你的算法好2~N / 2倍。 Greg可能意味着Horowitz和Sahni算法可以解决问题的两倍大的问题(在子集总和中有两倍的数字)
理论上确实如此,但在实践中,Horowitz和Sahni可以解决(在家用计算机上)大约60个数字的实例,而类似于你的算法可以处理1000个数字的实例(假设这些数字本身并不太大) )
事实上,这两种算法甚至可以混合使用,这是你的类型和Horowitz和Sahni算法。这种解具有伪多项式复杂性和O(2 ^ n / 2)的悲观复杂性。
经过培训的计算机科学家可以通过生成函数理论来构建这样的算法。
训练有素和未经训练的人都可以按照你的方式思考。
不一定要用“它是否已知?”来思考。你可以自己发明这样的算法对你很重要。这意味着您可能可以自己发明其他重要的算法,并且有一天可能会发现一个未知的算法。了解该领域的当前进展以及文献中的内容有所帮助。否则你将继续重新发明轮子。
当我回到高中时,我重新设计了Dijkstra算法。我的版本有很复杂,因为我对数据结构一无所知。无论如何,我仍为自己感到自豪。
如果你还在学习注意生成函数理论。
您可能还想查看wiki:
psuedopolynomial时间 弱NP完全 强烈的NP完全 生成函数
Megli
答案 2 :(得分:1)
这意味着当N增加时,重复子集的数量呈指数增长,并且唯一有用子集的数量仅呈线性增加。
不一定 - 重复子集总和的数量也由集合中最接近零的数字的值确定(最小距离为零越大 - 集合的重复子集总和越少)。 p>
通常,我们现在移动枚举集合中的所有子集。
不幸的是,枚举集合子集的所有总和需要执行指数数量的加法运算(在您的示例中为2 ^ 7或128)。否则,算法将如何确定唯一总和恰好是什么?因此,尽管第一步之后的步骤很可能具有多项式运行时间,但算法整体上具有指数复杂性(因为算法的速度与其最慢的部分一样快)。
顺便提一下,最着名的解决子集和问题的算法(Horowitz和Sahni,1974)具有O(2 ^ N / 2)复杂度 - 这使得它的速度大约是该算法的两倍。