识别集合中的数字集合

时间:2011-10-21 14:34:59

标签: java algorithm collections set

我有一组带有数字的集合。说

A = {-2, 5, 6, 8}  
B = {-2, 4}  
C = {-2, 4, 6, 8}  
D = {1, -2, 15}  
E = {1, 4, 15}  
F = {1, 15}  
G = {2, 5, 6, 15}  
H = {2, 6, 15}  

现在我想找到一组4个数字并找到属于这个集合的集合。 例如,我可以在这里定义一个集合X = {1, -2, 4, 15},并且可以看到B,D,E和F属于这个集合。找到这些集并不是很困难。

然而,我面临的问题是我想识别此集合中长度为m个数字的所有集合。所以实际上,当把上面的例子作为输入时,一个算法得到m = 4{A,B,C,D,E,F,G,H}作为输入并给我{B,D,E,F}{B, C}(因为它们都包含数字)在集合{-2,-4,6,8}中。

我能想出答案的唯一方法是使用可用集合中的数字生成所有可能的length = 4集合,并确定每个集合是否合适。这似乎有点生硬。

有什么好的提示吗? (Java或PHP)?

2 个答案:

答案 0 :(得分:1)

在Java中,您可以使用集合的retainAll()方法或静态方法Collections.disjoint(a,b)来查找两者中包含的元素,或者只检查它们是否具有公共元素。

示例:

Set<Integer> setA = new HashSet<Integer>();
setA.add( -2 );
setA.add( 5 );
setA.add( 6 );
setA.add( 8 );

Set<Integer> setB = new HashSet<Integer>();
setB.add( -2 );
setB.add( -4 );
setB.add( 6 );
setB.add( 8 );

//fill with all values from setA
HashSet<Integer> setAB = new HashSet<Integer>( setA );
//keep only those values that are contained in setB as well
setAB.retainAll( setB );


System.out.println( setAB ); //prints "[-2, 8, 6]"

System.out.println( "A and B overlap: " + !Collections.disjoint( setA, setB ) ); //prints "A and B overlap: true"

如果你有一组集合,例如List<Set<Integer>>迭代它们并将每一个与输入集进行比较。

或者,您可以使用Apache Commons Collections类CollectionUtils,它提供了CollectionUtils.containsAny( collection1,collection2 )CollectionUtils.union( collection1,collection2 )等方便的方法。

Google Guava也可能有类似的类别。

答案 1 :(得分:0)

我会递归地解决这个问题。考虑一组。如果从这个集合中获取元素会使元素的数量大于m,那么考虑下一组。从这一组中获取元素。如果没有更多的集合需要考虑,那么您可以使用一些集合作为可能的结果。如果此结果中的元素数等于m,则取此结果。现在“不加考虑”最后考虑设定,并考虑下一组。重复,直到没有更多的集合要考虑。最后,删除所有现有结果子集的结果。