Algorithm 查找数组中等于零的和
给定一个整数数组,找到至少一个和为0的整数集 例如,给定Algorithm 查找数组中等于零的和,algorithm,Algorithm,给定一个整数数组,找到至少一个和为0的整数集 例如,给定[-1,8,6,7,2,1,-2,-5],算法可能会输出[-1,6,2,-2,-5],因为这是输入数组的子集,总和为0 解决方案必须在多项式时间内运行。您将很难在多项式时间内执行此操作,因为问题被称为,并且被称为 但是,如果你找到了多项式解,你就解决了“”问题,这将使你变得非常富有 最接近已知多项式解的是一个近似值,例如,它将试图得到一个和接近但不一定等于0的答案。这是一个问题,它是NP完全的,但有一个伪多项式时间算法。见维基 如果集合中的
[-1,8,6,7,2,1,-2,-5]
,算法可能会输出[-1,6,2,-2,-5]
,因为这是输入数组的子集,总和为0
解决方案必须在多项式时间内运行。您将很难在多项式时间内执行此操作,因为问题被称为,并且被称为 但是,如果你找到了多项式解,你就解决了“”问题,这将使你变得非常富有 最接近已知多项式解的是一个近似值,例如,它将试图得到一个和接近但不一定等于0的答案。这是一个问题,它是NP完全的,但有一个伪多项式时间算法。见维基 如果集合中的项目和与项目数量呈多项式关系,则问题可以通过多项式解决,wiki: 这个问题可以如下解决 使用动态规划。假设 顺序是
x1, ..., xn
我们希望确定是否存在
求和为0的非空子集。让N
是负值和
P为正值之和。
定义布尔值函数
Q(i,s)为值(真或假)
的
因此,问题的解决办法是
Q(n,0)的值
显然,如果sQ(1,s) := (x1 = s).
然后,对于i=2,…,n,集
Q(i,s) := Q(i − 1,s) or (xi = s) or Q(i − 1,s − xi) for N ≤ s ≤ P.
对于每个赋值,Q的值
右边已经知道了,
要么是因为它们存储在
表中显示了i或的先前值
因为Q(i)− 1,s− xi)=如果为s,则为false−
席氏− 席:所以,
算术运算总数
是O(n(P− N) )。例如,如果所有
对于某些k,值为O(nk),然后
所需时间为O(nk+2)
该算法易于修改为
如果存在,则返回总和为0的子集
这是一个
此解决方案不算作
复杂性理论中的多项式时间
因为P− N不是多项式
问题的大小,即
用于表示它的位数。
该算法是多项式的
N和P的值,它们是
它们的位数是指数级的
一个更为普遍的问题需要解决
将子集求和为指定值
(不一定是0)。这是可以解决的
通过对
上面的算法。如果
每个席是正的,被
同样的常数,皮辛格发现了一个线性方程
时间算法[2]
这是一个众所周知的NP完全问题
如果你对算法感兴趣,那么很可能你是数学爱好者,我建议你看看
- 在数学世界
如果是这样,为什么在我的问题上没有“设置悬赏”按钮?它必须是某个年龄吗?子集和问题是。只有多项式时间。请参阅有关赏金问题的常见问题解答。“问题必须至少有两天才能有资格获得赏金。”@froeschli,啊,我错过了。谢谢。赏金:嗯,这就是为什么他想分配赏金。证明P=NP是要付出代价的,OP知道这一点。这是co-NP,但它有一个伪多项式时间算法,并且受目前普通PC上的限制,这可以足够快地完成。co-NP和NP-complete是两件不同的事情。不知道它在co-NP中,因为如果给定的问题没有解决方案,没有任何已知的短证书可以证明这一点。它是NP完全的,因此在NP中,但这并不意味着它是co NP中的成员。@Keith:NP=co NP是一个开放的问题,如果一个NP完全的问题在co NP中,那么NP=co NP。@Moron:是的,我知道。我不确定这与赛义德说的话或我对它的评论有关。@Keith:这与你的评论有关。它不在co-NP中的一个更令人信服的原因是它是NP完全的,而不是我们找不到一个短的证书,这对于复合/素数(检查一个数字是否是复合/素数)是正确的,它同时在NP和co-NP中(事实上在P中)。我只是同意并试图让你的评论更具说服力。不管怎样,我的讨论结束了。。。
Q(i,s) := Q(i − 1,s) or (xi = s) or Q(i − 1,s − xi) for N ≤ s ≤ P.