Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找数组中等于零的和_Algorithm - Fatal编程技术网

Algorithm 查找数组中等于零的和

Algorithm 查找数组中等于零的和,algorithm,Algorithm,给定一个整数数组,找到至少一个和为0的整数集 例如,给定[-1,8,6,7,2,1,-2,-5],算法可能会输出[-1,6,2,-2,-5],因为这是输入数组的子集,总和为0 解决方案必须在多项式时间内运行。您将很难在多项式时间内执行此操作,因为问题被称为,并且被称为 但是,如果你找到了多项式解,你就解决了“”问题,这将使你变得非常富有 最接近已知多项式解的是一个近似值,例如,它将试图得到一个和接近但不一定等于0的答案。这是一个问题,它是NP完全的,但有一个伪多项式时间算法。见维基 如果集合中的

给定一个整数数组,找到至少一个和为0的整数集

例如,给定
[-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)的值

显然,如果s 所以这些值不需要存储或计算。创建一个数组以 将值Q(i,s)保持1≤ 我≤ N 和N≤ s≤ P

现在可以使用 简单递归。最初,对于N≤ s ≤ P、 设置

Q(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完全问题

如果你对算法感兴趣,那么很可能你是数学爱好者,我建议你看看

  • 在数学世界
在这里你可以找到它的算法

初始化列表S以包含一个元素0

对于每个i,从1到N do

设T是由xi+y组成的列表, 为了所有的人

让你成为T和S的结合体 排序U

空的

设y为U的最小元素

加y到S

对于U中的每个元素z 增加顺序做//修剪列表 消除数字 挨着
如果是这样,为什么在我的问题上没有“设置悬赏”按钮?它必须是某个年龄吗?子集和问题是。只有多项式时间。请参阅有关赏金问题的常见问题解答。“问题必须至少有两天才能有资格获得赏金。”@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.