Я пытаюсь выработать решение вышеуказанной проблемы, и я пришел с этимНахождение подмножеств размера к для заданного набора размера п
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 < Integer> к ArrayList <?> в строке 21 затмение говорит
Невозможно создать тип ArrayList <?> Как исправить это?
Хорошо подумайте об этом. Существуют C (n, k) способы взять подмножество размера k из набора из n элементов. Если функция generatePerm разумна, то временная сложность алгоритма будет равна C (n, k). См. Https://en.wikipedia.org/wiki/Binomial_coefficient для определения функции C. –
Спасибо за вышесказанное. Можете ли вы рассказать мне о сложности рекурсивной реализации, приведенной здесь: http://stackoverflow.com/questions/12548312/find-all-subsets-of-length-k-in-an-array и C (n, k) наилучшая возможная сложность? –
Может ли кто-нибудь сказать мне космическую сложность этого решения? –