Как найти все возможные расщепления набора?

97
10

Мне нужно разбить множество A на два множества B и C и найти все возможные расщепления A 'элементов в B и C.


Итак, когда первый размер разделения равен 2, тогда


[abcd] → [ab] [cd], [ac] [bd], [cd] [ab]..



И когда первый размер разделения равен 1, тогда


[abcd] → [b] [acd], [a] [bdc], [d] [abc]..



Любая идея, как это можно сделать?

спросил(а) 2021-01-19T18:23:49+03:00 2 месяца, 3 недели назад
1
Решение
61

вы можете использовать apache commons math для java. Если вы используете maven, добавьте его зависимость в pom, иначе вручную загрузите и добавьте банку.


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, list.get(i)

ответил(а) 2021-01-19T18:23:49+03:00 2 месяца, 3 недели назад
61

Вы имеете в виду алгоритм вроде этого? Я написал это быстро, надеюсь, это помогает:

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);
}
}

ответил(а) 2021-01-19T18:23:49+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема