【问题标题】:Recognize sets of numbers in collection of sets识别集合中的数字集合
【发布时间】:2011-12-12 15:41:07
【问题描述】:

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

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)?

【问题讨论】:

  • E 和 F 不包含任何 {-2,-4,6,8},那么为什么要返回呢?
  • 您想找到长度为 4 的最小组数吗?并输出它们?
  • 不应输出如下:{A}, {B, C}, {B, D, E, F}, {B, E, F}, {D, E, F }, {F, H}, {G, H}?
  • @Dialectus:你说得对。

标签: java algorithm collections set


【解决方案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&lt;Set&lt;Integer&gt;&gt; 遍历它们并将每一个与输入集进行比较。

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

Google Guava 也可能有类似的类。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我喜欢这种方法并将尝试实施它
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2023-03-20
    • 2016-04-12
    • 2018-07-15
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多