Algorithm 在三个数组列表中查找总和为零的所有记录组合?

Algorithm 在三个数组列表中查找总和为零的所有记录组合?,algorithm,Algorithm,假设有三个数组列表,每个数组列表的长度相等,并且有正、负和零。我必须写一个程序来找出和等于零的组合。所以基本上,如果阵列是:- A = {0, -1, 2} B = {0, -1, -2} C = {0, -2, 0} O/p:A[0]+B[0]+C[0],A[2]+B[2]+C[2]等 我可以想出两种方法, 1.有3个for循环,使用a[i]+b[j]+c[k]计算和,如果为零,则打印索引。 大O将是O(N^3) 2.有两个for循环,但使用二进制搜索查找第三个元素,该元素的和为零。 大O将

假设有三个数组列表,每个数组列表的长度相等,并且有正、负和零。我必须写一个程序来找出和等于零的组合。所以基本上,如果阵列是:-

A = {0, -1, 2}
B = {0, -1, -2}
C = {0, -2, 0}
O/p:A[0]+B[0]+C[0],A[2]+B[2]+C[2]等

我可以想出两种方法, 1.有3个for循环,使用a[i]+b[j]+c[k]计算和,如果为零,则打印索引。 大O将是O(N^3) 2.有两个for循环,但使用二进制搜索查找第三个元素,该元素的和为零。 大O将是O(N^2LogN)

还有别的办法吗

谢谢

编辑:
根据下面给出的答案,我的第一个解决方案是最快的。但是,如果问题是“找到”组合的数量,而不是打印它们,那么请参见下面的Grigor Gevorgyan答案。

最简单的方法是检查所有子集,但这有很差的运行时间。 没有进一步的限制,我相信这是NP完全子集和问题。有一个与背包问题相关的解决方案,它给出了一个体面的解决方案。

您是否需要找到所有和为0的组合,或者只找到一个组合,或者只找到一个包含3个元素的解决方案

解决方案应该是{A[0]}、{B[0]}、{C[0]}、{C[2]}、{A[0]、B[0]、C[0]}、{A[0]、B[0]、C[0]、C[2]}、{A[1]、B[1]、A[2]}、{A[2]、B[2]}等等



对数组进行排序。现在执行以下操作:
设置ans=0
有一个外部循环通过数组a,索引为i。现在设置j=0,k=n-1 看看sum=a[i]+b[j]+c[k]
如果总和<0,则增加j
如果sum>0减少k
如果sum==0,则找到等于b[j]c[k]的元素范围,并将范围长度乘积添加到答案中。然后将jk设置为超出该范围的第一个元素。
这是因为数组是排序的,加法是一个线性函数。
内部部分以O(n)运行,总体上O(n^2)复杂度

C++中的示例代码:

排序(a,a+n);
排序(b,b+n);
排序(c,c+n);
ans=0;
对于(i=0;i0)
{
总和=a[i]+b[j]+c[k];
if(和<0)++j;
否则,如果(总和>0)-k;
其他的
{ 
//找到相等的范围
对于(jj=j;jj=0&&c[kk]==c[k];--kk);
//从这些范围中添加对数量
ans+=(jj-j)*(k-kk);
j=jj,k=kk;
}
}
注意:数组排序a是不必要的,只是为了看起来好看:)

我认为这3个简单:

引用维基百科的文字:

有一种简单的算法可以在O(n2)时间内求解3SUM,方法是首先对数组中的每个元素进行散列,找到所有可能的对,然后使用散列表检查是否存在剩余值(即每个对总和的负数)


只有当您自己从某些存储器(如文件或任何输入流)将给定的数据读入数组列表时,此解决方案才有一定的速度。用
哈希表替换第三个数组列表
可以为您提供查找零和的第三个分量的恒定时间。在两个嵌套循环中,每次都会获得新的数组对
a[i]+b[j]
您在哈希表中查找的
c[n0]=-a[i]+b[j]
需要
O(1)
。因此总时间复杂度为O(n^2)。让我澄清一下,只有在允许您掌握阅读过程的情况下,这种解决方案才有帮助。如果您已经获得了数组列表,则不会加快任何速度。

您是否只对每个列表中只包含一个元素的集合感兴趣?您不可能击败
ω(N^3)
最坏情况运行时,如果您必须输出所有和为零的三元组,因为如果所有三个输入集都仅由零组成,那么所有组合和为零,因此输出的大小为
Omega(N^3)
。在这种情况下,即使二进制搜索在
O(logn)
时间中找到您要查找的范围,它也是
Omega(N)
是时候遍历它了。我有一个O(n^2)复杂度的解决方案,但前提是允许一些假设。请看plz,我相当确定其目的是每个“和”我们要寻找的是
a
B
C
中每一个元素的一个元素的总和。否则,一开始就没有三个输入序列的意义,我们可以有一个大小为9的单一输入序列。公平的说,这使问题变得容易多了……可能是个诡计问题,也可能是我使事情在默认情况下更加复杂:]它遗漏了一些有效的i,j,k三元组question@J.F.Sebastian谢谢,我忘记了相同的价值观。编辑了答案来考虑平等的范围。谢谢你的帮助。我也提到了我的答案中的排序-更快地解决问题。但是注意到一个问题,因为我的付出。例如,它不打印a[0]、b[0]和c[0];a[2]、b[2]、c[0]的组合。我想看看,你有什么想法吗?@parsh:你需要打印所有的组合还是只打印它们的数量?如果先打印,就不能比O(n^3)快,因为在所有元素相等的情况下,有n^3个组合,请参见Steve Jessop的评论。@GrigorGevorgyan:是的,我被要求打印所有组合,而不是它们的数量。那么根据你的+Steve的评论,我的第一个解决方案是最好的?是的,但前提是你假设