【问题标题】:How to find all possible splits of a set?如何找到集合的所有可能拆分?
【发布时间】:2016-01-10 17:31:08
【问题描述】:

我需要将集合 A 拆分为两个集合 B 和 C,并在 B 和 C 中找到 A' 元素的所有可能拆分。

所以当第一个分割大小为 2 时

[abcd] ->[ab] [cd], [ac] [bd], [cd] [ab]..

当第一个分割大小为 1 时

[abcd] -> [b] [acd], [a] [bdc], [d] [abc]..

知道如何做到这一点吗?

【问题讨论】:

  • 您正在尝试创建给定长度的所有排列。这个是针对字符串的,但技术是一样的:geeksforgeeks.org/print-all-combinations-of-given-length
  • 不是排列。 abcd 和 bacd 是不同的排列,但如果你在中间分裂。两个分裂是一样的。这是一个组合问题。
  • 嗯,好吧,我理解错了这个问题:)
  • 对,这与排列无关。

标签: java


【解决方案1】:

你可以使用 apache commons math util for java。如果您使用的是 maven,请在 pom 中添加其依赖项,否则手动下载并添加 jar。

https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math3/util/Combinations.html

//n is no of elements. k is k-combinations
public Combinations(int n, int k)

//you can use this method to get every combination    
public Iterator<int[]> iterator()

这将为您提供所有 k 组合,并且值将根据索引。您需要将索引转换为元素。

如果数组 arr,你可以做 arr[i]。 如果是列表,则 list.get(i)

【讨论】:

  • 这就像一个魅力!对于上面的示例,我设置 N=4 和 k=2,遍历所有 k 组合,将它们用作 A 的索引(所以我得到了第一个拆分),然后从 A 的副本中删除它们(这是第二个拆分)。
  • 酷。您可以拥有一个包含整数的集合(或列表),而不是创建 A 的另一个副本。使用所有索引进行初始化,然后您可以使用 set.removeAll(Arrays.asList(first split int[])) 来获取第二个拆分索引。可能会减少行数。如果您这样做,您将始终拥有 A 的一份副本,并且拆分由索引标识。如果你想解决它,你可以随时使用 A[i]。重点是尽量避免重复原始数组,这样您的代码就会简洁易懂。
【解决方案2】:

你的意思是这样的算法吗?我写得很快,希望对你有帮助:

public void split(int s, String list1, String list2){
    if(s > list1.length()){
        System.err.println("To big s");
        return;
    }
    if(s == 0){
        System.out.println(list2 + " "+ list1);
        return;
    }
    for(int i = 0; i < list1.length(); i++){
            String temp = list1.substring(0, i) + list1.substring(i+1, list1.length());
            String temp2 = list2 + list1.charAt(i);
            split(s-1, temp, temp2);
    }       
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多