комбинация комбинации Java - PullRequest
       14

комбинация комбинации Java

3 голосов
/ 27 сентября 2010

Мне нужно найти комбинацию комбинаций в JAVA.

У меня, например, 6 учеников в классе.Из них мне нужно создать комбинацию из 4 человек в группе, и для каждой группы я могу выбрать интимную группу из 2.

Я должен убедиться, что нет двойников (порядок не имеет значения).!и нужно напечатать группу из 4 человек.

Тем не менее, это сложная часть:

Итак, определение студентов с номерами:

Если я распечатаю 1234 в качестве одной из комбинаций Я не могу распечатать также 1256, поскольку 12 появляется как в 1234, так и в 1256.

Как я могу написать это на Java?

EDITED

Вывод ([1,2,3,4,5], 3,2) будет:

  1. Комбинации без повторения (n = 5, r = 3) {1,2,3} {1,2,4} {1,2,5} {1,3,4} {1,3,5} {1,4,5} {2,3,4} {2,3,5} {2,4,5} {3,4,5}

  2. удаление повторяющихся групп из 2-х элементов оставит мне только: {1,2,3} {1,4,5} (я удалил группы с комбинациями 12,13,23,45,14,15, так как они уже появляются в первых двух, которые у меня естьнайдено.

Ответы [ 2 ]

1 голос
/ 27 сентября 2010

Хорошо, вот простая эмуляция процесса, который вы описали. Но я использую двоичные числа для представления набора, это облегчает манипуляции. Например, число 19 - это 10011 в двоичной форме: это означает, что студенты 0, 3 и 4 выбраны (в этих позициях 1).

Сначала маленький помощник.

// return all subsets of 'set', having size 'subsetSize'
Set<Integer> allSubsets(int set, int subsetSize) {
    Set<Integer> result = new HashSet<Integer>();
    if (subsetSize == 0) {
        result.add(0);
        return result;
    }
    if (set == 0) {
        return result;
    }

    // check if 1st element is present
    if (set % 2 == 1) {
        // use 1st element, one less element to collect
        for (Integer i : allSubsets(set / 2, subsetSize - 1)) {
            result.add(i * 2 + 1);
        }
    }
    // not use 1st element
    for (Integer i : allSubsets(set / 2, subsetSize)) {
        result.add(i * 2);
    }

    return result;
}

И основная программа. Предложения приветствуются.

    int N = 5;
    int M = 3;
    int Z = 2;

    List<Integer> result = new ArrayList<Integer>();

    // get all groups of M elements from 'wholeSet'
    int wholeSet = (1 << N) - 1;
    for (int s : allSubsets(wholeSet, M)) {
        // Check all subsets of 'Z' elements from set 's'
        boolean valid = true;
        for (int t : allSubsets(s, Z)) {
            // check if this Z-element subset already was used
            for (int past : result) {
                // check if 't' is subset of 'past' set
                if ((past|t) == past) {
                    valid = false;
                    break;
                }
            }
            if (!valid) {
                break;
            }
        }

        if (valid) {
            // none of Z-element subsets of 's' were used before
            result.add(s);
        }
    }

Но для больших вводов могут потребоваться улучшения (например, памятка ). Но сейчас, так как вы не говорите, какой вклад вы ожидаете, я предполагаю, что это достаточно хорошо.

0 голосов
/ 27 сентября 2010

Представьте, что у вас есть объект Student с равными, сравнивающими их Primarykey.В вашем примере учащийся 1 вернет 1, 2 вернет 2 и т. Д.

Поместите их все в набор, это обеспечит отсутствие двойного.

Повторяйте, хотяустановите на 4, а затем на 2 и вернет вам желаемый результат.

...