查找给定大小为n的大小为k的子集

时间:2013-12-24 21:17:20

标签: java generics recursion set time-complexity

我正在尝试找出上述问题的解决方案,我想出了这个

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;


public class Subset_K {
public static void main(String[]args)
{
Set<String> x;
int n=4;
int k=2;
int arr[]={1,2,3,4};
StringBuilder sb=new StringBuilder();
for(int i=1;i<=(n-k);i++)
    sb.append("0");
for(int i=1;i<=k;i++)
    sb.append("1");
String bin=sb.toString();
x=generatePerm(bin);
Set<ArrayList <Integer>> outer=new HashSet<ArrayList <Integer>>();
for(String s:x){
    int dec=Integer.parseInt(s,2);
    ArrayList<Integer> inner=new ArrayList<Integer>();
    for(int j=0;j<n;j++){
        if((dec&(1<<j))>0)
            inner.add(arr[j]);
    }
    outer.add(inner);
}
for(ArrayList<Integer> z:outer){
    System.out.println(z);
}
}

public static Set<String> generatePerm(String input)
{
Set<String> set = new HashSet<String>();
if (input == "")
    return set;

Character a = input.charAt(0);

if (input.length() > 1)
{
    input = input.substring(1);

    Set<String> permSet = generatePerm(input);

    for (String x : permSet)
    {
        for (int i = 0; i <= x.length(); i++)
        {
            set.add(x.substring(0, i) + a + x.substring(i));
        }
    }
}
else
{
    set.add(a + "");
}
return set;
}
}

我正在研究一个用于测试目的的4个元素集,并使用k = 2。我尝试做的是最初生成一个二进制字符串,其中设置k位并且不设置n-k位。现在使用这个字符串,我找到了这个字符串的所有可能的排列。然后使用这些排列,我输出集合中的相应元素。现在我无法弄清楚这段代码的复杂性,因为我使用了其他人的generatePerm方法。有人可以帮助我解决generatePerm方法的时间复杂性以及我的解决方案的总体时间复杂性。我在这里找到了这个问题的其他递归实现Find all subsets of length k in an array但是我也无法弄清楚它的复杂性。所以需要一些帮助。

此外,我试图重新考虑我的代码,使其不仅适用于整数,还适用于所有类型的数据。我对泛型没什么经验。所以当我尝试修改ArrayList&lt;整数&GT;到ArrayList&lt; ?&GT;第21行eclipse说

  

无法实例化类型ArrayList&lt; ?&GT;   我该如何纠正?

1 个答案:

答案 0 :(得分:3)

您可以始终使用ArrayList<Object>。这将接受任何类型的对象。如果您想要一个由调用代码确定的特定类型,则需要引入泛型类型参数。

请注意,在generatePerm方法中,您不应使用测试

if (input == "")

相反,你应该使用:

if ("".equals(input))

如果input interned 字符串"",则您当前的代码才会成功。例如,如果将input计算为长度为零的substring(),则无法工作。通常,您应始终将字符串与.equals()而不是==进行比较(在非常特定的条件下,当您查找对象标识而不是对象相等时)。