2015-05-06 2 views
-5

Как разбить содержимое массива на два ведра и получить все комбинации?Java-алгоритм для разбиения списка в кодах всех комбинаций

Например: Массив [А, В, С]

Bucket 1  Bucket 2 
-    ABC 
A    BC 
BC   A 
AB   C 
C    AB 
AC   B 
B    AC 
ABC   - 

Число перестановок следует по формуле: 2^N, где N является длиной массива.

Вот код, который у меня есть. Однако он не проходит через все возможные комбинации:

for(int i=0; i<=testPortfolioArray.length; i++) { 
     Object[] bucket1 = Arrays.copyOfRange(testPortfolioArray, 0, i); 
     Object[] bucket2 = Arrays.copyOfRange(testPortfolioArray, i, testPortfolio.size()); 
     if(i>0 && i<testPortfolioArray.length) { 
      bucket1 = Arrays.copyOfRange(testPortfolioArray, i, testPortfolio.size()); 
      bucket2 = Arrays.copyOfRange(testPortfolioArray, 0, i); 
     } 
    } 
+0

Просьба предоставить любой код, логику и процессы, с которыми вы следовали, чтобы достичь этого, и мы можем предложить, где вы можете улучшить или исследовать. Во-первых, как вы, математически, достигнете того, что хотите? –

+0

Как подсказка: просто найдите все возможные подмножества и поместите их в оба ведра. Например, «A-BC» совпадает с «BC-A», только части находятся в разных ковшиках. Нет необходимости вычислять это конкретное подмножество дважды. – Tom

ответ

0

Подумайте сначала о структурах данных, которые вы хотите, чтобы представить свое решение: Для одного деления объектов, каждый объект находится либо в ведре 1 или в ведре- , поэтому это можно описать с использованием одного бита. Затем, если у вас есть n объектов для разделения, деление может быть представлено строкой из n бит.

Используя эту структуру данных, набор всех делений состоит из всех списков из n двоичных цифр с отображением того, что элемент i находится в ведре 1, если i-й бит равен 0 и находится в ведре 2, если i- й бит равен 1.

Это дает вам то, что вам нужно?

Смежные вопросы