从更大的列表中找出2个相等和的列表

时间:2014-02-10 18:54:34

标签: java algorithm

好吧基本上我有一个列表或整数数组

列表=(1,3,22,17,22,4,15,40)

我需要找到两个这样的列表:

List1 =(1,3,17,4,15,22)... Sum = 62

List2 =(22,40)... Sum = 62

应使用所有整数,整数应位于List1或List2

----我的第一个想法----

Choose the largest nb i.e 40 and try to find integers equal to 40 and add 
to the second list ... But that's not the way ... 

上面的列表是一个示例列表......如果可能,我应该能够找到任何给定列表的List1和List2。

2 个答案:

答案 0 :(得分:2)

第一步是找到列表中所有元素的总和。这将始终是您正在寻找的两个子列表总和的两倍。使用你的例子,(1,3,22,17,22,4,15,40)的总和是124,这是62的两倍。

所以现在你要在列表中找到一组总和为62的数字。你不必担心找到两组(如果你找到一组,剩下的数字肯定会总和为62) 。我在算法上做到这一点 - 首先查找一组大小为1的元素,其元素总和为62(即,遍历列表并检查是否有任何数字为62)。如果存在这样的数字,那么你已经完成了。如果没有,接下来寻找大小为2的集合。这很棘手,因为你必须查看所有可能的组合。由于您有7个数字,因此有(7 * 6)/ 2 = 21种可能性。如果其中任何一个是62,你就完成了。如果没有,继续检查大小为3的组。依此类推,直到你达到7/2的大小(在这种情况下你完成了3)。显然,对于大型集合,这个过程将涉及大量的计算和比较;它可以通过一些快捷方式进行优化,但基本算法是相同的。

如果最后没有找到总和为62的子集,那是因为没有这样的子集。

答案 1 :(得分:1)

一般来说,你的问题是NP难问题,这意味着当数组n的大小增长时,可能不存在快速(多项式时间)解决方案。但是,如果您的数字是相对较小的整数(意味着它们的绝对值之和大约为10亿或100亿或更少,具体取决于您拥有的内存量),您可以使用动态编程。基本上对于数组的前k个元素,可以存储可以使用这些k个元素的子集进行的所有可能的总和。通过获取由前k个元素的子集形成的所有和,然后添加数组的第(k + 1)个元素,然后增加可获得的和的集合,逐步增加k。假设你的n个数是整数,这种方法的总复杂度是O(nM),其中M是数组中元素绝对值的总和。如果内存不足,可以使用磁盘空间来存储可获取的子集,但这会使运行时间明显变慢;但是,使用磁盘空间可以处理数字数组,其绝对值加起来大约为1万亿或更多,具体取决于您拥有的磁盘空间