LinkedHashSet и subList, получение n из коллекции

Я пытаюсь сделать домашнее задание по математике, найти подмножество коллекции {1,2,..,n}, где n - число, указанное в коде, я не могу сделать это с помощью подсписка, поэтому мне нужно получить ваш помогите с математическим программированием.

Например, для n = 2:

[12]
[1][2]

В нем 2 элемента.

Например, для n = 3:

[1][2][3]
[12][3]
[13][2]
[23][1]
[123]

В нем 5 элементов.

В нем пять элементов.

Для n = 4:

[1][2][3][4]
[12][3][4]
[13][2][4]
[14][2][3]
[23][1][4]
[24][1][3]
[34][1][2]
[12][34]
[13][24]
[14][23]
[123][4]
[124][3]
[134][2]
[234][1]
[1234]

Он состоит из 15 элементов.

У вас есть идеи, как это сделать?

Я пробовал много возможностей с LinkedHashSet и подсписком внутри цикла, но более 2 часов я понятия не имел, как это сделать, вывод такой.

Есть ли какая-нибудь библиотека на Java для получения этого вывода? Я бы сделал это вручную, но может быть и другой способ.

import org.paukov.combinatorics.*;
import org.paukov.combinatorics.util.ComplexCombinationGenerator;

public class Main {
    public static void main(String args[]){

           // create a vector (A, B, B, C)
           ICombinatoricsVector<String> vector = Factory.createVector(new String[] { "1", "2", "3"});

           // Create a complex-combination generator
           Generator<ICombinatoricsVector<String>> gen = new ComplexCombinationGenerator<String>(vector, 1);
           Generator<ICombinatoricsVector<String>> gen2 = new ComplexCombinationGenerator<String>(vector, 2);
           Generator<ICombinatoricsVector<String>> gen3 = new ComplexCombinationGenerator<String>(vector, 3);
           // Iterate the combinations
           for (ICombinatoricsVector<ICombinatoricsVector<String>> comb : gen) {
                  System.out.println(ComplexCombinationGenerator.convert2String(comb) + " - " + comb);
               }
           for (ICombinatoricsVector<ICombinatoricsVector<String>> comb : gen2) {
                  System.out.println(ComplexCombinationGenerator.convert2String(comb) + " - " + comb);
               }
           for (ICombinatoricsVector<ICombinatoricsVector<String>> comb : gen3) {
                  System.out.println(ComplexCombinationGenerator.convert2String(comb) + " - " + comb);
               }

    }


}






([1, 2, 3]) - CombinatoricsVector=([CombinatoricsVector=([1, 2, 3], size=3)], size=1)
([1],[2, 3]) - CombinatoricsVector=([CombinatoricsVector=([1], size=1), CombinatoricsVector=([2, 3], size=2)], size=2)
([2, 3],[1]) - CombinatoricsVector=([CombinatoricsVector=([2, 3], size=2), CombinatoricsVector=([1], size=1)], size=2)
([2],[1, 3]) - CombinatoricsVector=([CombinatoricsVector=([2], size=1), CombinatoricsVector=([1, 3], size=2)], size=2)
([1, 3],[2]) - CombinatoricsVector=([CombinatoricsVector=([1, 3], size=2), CombinatoricsVector=([2], size=1)], size=2)
([1, 2],[3]) - CombinatoricsVector=([CombinatoricsVector=([1, 2], size=2), CombinatoricsVector=([3], size=1)], size=2)
([3],[1, 2]) - CombinatoricsVector=([CombinatoricsVector=([3], size=1), CombinatoricsVector=([1, 2], size=2)], size=2)
([1],[2],[3]) - CombinatoricsVector=([CombinatoricsVector=([1], size=1), CombinatoricsVector=([2], size=1), CombinatoricsVector=([3], size=1)], size=3)
([1],[3],[2]) - CombinatoricsVector=([CombinatoricsVector=([1], size=1), CombinatoricsVector=([3], size=1), CombinatoricsVector=([2], size=1)], size=3)
([3],[1],[2]) - CombinatoricsVector=([CombinatoricsVector=([3], size=1), CombinatoricsVector=([1], size=1), CombinatoricsVector=([2], size=1)], size=3)
([3],[2],[1]) - CombinatoricsVector=([CombinatoricsVector=([3], size=1), CombinatoricsVector=([2], size=1), CombinatoricsVector=([1], size=1)], size=3)
([2],[3],[1]) - CombinatoricsVector=([CombinatoricsVector=([2], size=1), CombinatoricsVector=([3], size=1), CombinatoricsVector=([1], size=1)], size=3)
([2],[1],[3]) - CombinatoricsVector=([CombinatoricsVector=([2], size=1), CombinatoricsVector=([1], size=1), CombinatoricsVector=([3], size=1)], size=3)

person WinterTime    schedule 22.06.2015    source источник
comment
Ну, это не обычные подмножества. Подмножество будет содержать элементы 2,3,4, если надмножество будет 1,2,3,4,5. Но у вас другие требования. Кажется, вы делите супермножество на множества, которые содержат все элементы, но не имеют элементов, общих с каким-либо подмножеством. Или что-то вроде того.   -  person markspace    schedule 23.06.2015
comment
Да, мне просто нужно получить этот результат, и я пытаюсь сделать это на съемках, но я не думаю, что это вообще возможно, или моя математика думает, что это слишком плохо.   -  person WinterTime    schedule 23.06.2015
comment
Это разные? [12][34] и [34][12]? Почему?   -  person Reut Sharabani    schedule 23.06.2015
comment
Вы правы, я сделал ошибку, создавая это (в уме). Также удалены [23][14][24][13][34][12]   -  person WinterTime    schedule 23.06.2015
comment
Терминология для этого заключается в том, что вы ищете способы разделить {1,...,n} на подмножества.   -  person Teepeemm    schedule 23.06.2015


Ответы (2)


Это комбинаторика. См. дополнительную информацию о структуре, которую необходимо понять, например перестановка без повторения, также называемая комбинацией.

Вас может заинтересовать combinatoricslib, библиотека Java в Google Code, которую вы можете использовать для своих программа.

Вы также можете попробовать решить ее без библиотеки. Это не должно быть слишком сложно. Я думаю, вам нужно использовать рекурсию.


Я тестировал разделы списка:

import org.paukov.combinatorics.*;
import org.paukov.combinatorics.util.ComplexCombinationGenerator;

public class Main {

    public static void main(String args[]){

        // create a vector (1, 2, 3, 4)
        ICombinatoricsVector<String> vector = Factory.createVector(new String[] { "1", "2", "3", "4" });

        // Create a complex-combination generator
        Generator<ICombinatoricsVector<String>> gen = new ComplexCombinationGenerator<String>(vector, 2);

        // Iterate the combinations
        for (ICombinatoricsVector<ICombinatoricsVector<String>> comb : gen) {
            System.out.println(ComplexCombinationGenerator.convert2String(comb) + " - " + comb);
        }
    }
}

И результат был

([1],[2, 3, 4]) - CombinatoricsVector=([CombinatoricsVector=([1], size=1), CombinatoricsVector=([2, 3, 4], size=3)], size=2)
([2, 3, 4],[1]) - CombinatoricsVector=([CombinatoricsVector=([2, 3, 4], size=3), CombinatoricsVector=([1], size=1)], size=2)
([2],[1, 3, 4]) - CombinatoricsVector=([CombinatoricsVector=([2], size=1), CombinatoricsVector=([1, 3, 4], size=3)], size=2)
([1, 3, 4],[2]) - CombinatoricsVector=([CombinatoricsVector=([1, 3, 4], size=3), CombinatoricsVector=([2], size=1)], size=2)
([1, 2],[3, 4]) - CombinatoricsVector=([CombinatoricsVector=([1, 2], size=2), CombinatoricsVector=([3, 4], size=2)], size=2)
([3, 4],[1, 2]) - CombinatoricsVector=([CombinatoricsVector=([3, 4], size=2), CombinatoricsVector=([1, 2], size=2)], size=2)
([3],[1, 2, 4]) - CombinatoricsVector=([CombinatoricsVector=([3], size=1), CombinatoricsVector=([1, 2, 4], size=3)], size=2)
([1, 2, 4],[3]) - CombinatoricsVector=([CombinatoricsVector=([1, 2, 4], size=3), CombinatoricsVector=([3], size=1)], size=2)
([1, 3],[2, 4]) - CombinatoricsVector=([CombinatoricsVector=([1, 3], size=2), CombinatoricsVector=([2, 4], size=2)], size=2)
([2, 4],[1, 3]) - CombinatoricsVector=([CombinatoricsVector=([2, 4], size=2), CombinatoricsVector=([1, 3], size=2)], size=2)
([2, 3],[1, 4]) - CombinatoricsVector=([CombinatoricsVector=([2, 3], size=2), CombinatoricsVector=([1, 4], size=2)], size=2)
([1, 4],[2, 3]) - CombinatoricsVector=([CombinatoricsVector=([1, 4], size=2), CombinatoricsVector=([2, 3], size=2)], size=2)
([1, 2, 3],[4]) - CombinatoricsVector=([CombinatoricsVector=([1, 2, 3], size=3), CombinatoricsVector=([4], size=1)], size=2)
([4],[1, 2, 3]) - CombinatoricsVector=([CombinatoricsVector=([4], size=1), CombinatoricsVector=([1, 2, 3], size=3)], size=2)

Я думаю, это то, что вы искали. Однако он нуждается в некоторой настройке (возможно, упорядочивание и добавление начальных элементов списка, таких как [1],[2],[3],[4]).

person Ely    schedule 22.06.2015
comment
Уже читал, но у меня другие требования, нужно использовать все номера в коллекции. Используя комбинаторику, я получу, например, {1,2,3,4}: {}, {12}, {13} и т. д. - person WinterTime; 23.06.2015
comment
См. комбинацию, а не подмножество. - person Ely; 23.06.2015
comment
Или просто используйте рекурсию, чтобы сделать это самостоятельно. Если у меня будет время, я постараюсь привести пример. - person Ely; 23.06.2015
comment
Я пытаюсь сделать это с этой библиотекой на данный момент, я вернусь с отзывами. - person WinterTime; 23.06.2015
comment
Я добавил ближайший, но все еще не получил правильный. @редактировать - person WinterTime; 23.06.2015
comment
Что вы подразумеваете под рекурсией? Как я могу использовать это здесь? - person WinterTime; 23.06.2015
comment
Не могли бы вы сначала проверить, может ли раздел List вас заинтересовать? Под рекурсией я подразумеваю, что если вы не используете библиотеку, вам нужно будет делать рекурсивные вызовы функций. Не уверен, что вы знакомы с концепцией рекурсии. Но сначала проверьте список разделов, пожалуйста. Я думаю, это то, что вы ищете. - person Ely; 23.06.2015
comment
Да, это правда, но он показывает несколько коллекций, поэтому я попытаюсь их отрезать, и это то, что мне нужно, спасибо! - person WinterTime; 23.06.2015
comment
Привет ! Я нашел способ, который я хотел, чтобы вывод, который вы привели, происходил из нескольких коллекций, но я отрезал его :) ([2],[1, 3, 4]) - CombinatoricsVector=([CombinatoricsVector=([2] , size=1), CombinatoricsVector=([1, 3, 4], size=3)], size=2) ([1, 3, 4],[2]) - CombinatoricsVector=([CombinatoricsVector=([1 , 3, 4], размер=3), CombinatoricsVector=([2], размер=1)], размер=2) - person WinterTime; 23.06.2015

Эту проблему можно решить с помощью динамического программирования, в котором вы разбиваете сложную проблему на подмножества.

Я думаю, что этот пост может быть полезен: Комбинации набора чисел < /а>

person learningMyWayThru    schedule 22.06.2015