В чем ошибка моей функции для генерации всех комбинаций элементов массива?

Я пытаюсь создать массив, содержащий массивы всех возможных комбинаций целочисленного массива; исключая пустой набор и сам исходный набор. Это код, который я написал. Внешний цикл выполняется до тех пор, пока количество элементов, которые должны быть включены в подмножество, не сравняется с количеством элементов в исходном наборе. Внешний цикл for добавляет все элементы нового подмножества плюс один дополнительный элемент. Например, цикл должен пройти через: A, B, затем добавить C, затем добавить D; генерируя A,B,C и A,B,D. Затем подмножество должно перейти к B, C и добавить D, чтобы получить B, C, D. Этот процесс продолжается до тех пор, пока не будут созданы все подмножества. Однако я получаю исключение индекса массива за пределами границ.

    double pow = Math.pow(2.0, a.length);
    char[][] b = new char[(int)pow-2][a.length-1];

    int start = 0;
    int end = 0;
    int includedElements = 1;
    int curI = 0;

    while(includedElements<=a.length) {

        if(end == a.length) {
            start = 0;
            includedElements+=1;
            end = includedElements-1;
        }

        for(int h = end+1; h<a.length; h++) {
            b[curI] = new char[includedElements];

            for(int i = start, index = 0; i<=end; i++, index++) {
                b[curI][index] = a[i];
            }

            b[curI][b[curI].length] = a[h];
        }
        curI++;

        start+=1;
        end+=1;
    }

person CS-DS-ES-FS    schedule 14.02.2016    source источник


Ответы (1)


Я думаю, что вы должны сначала выяснить, чего вы действительно хотите. Существует разница между комбинацией и перестановкой (см. здесь). Когда вы это знаете, вы можете найти точный термин в Google. Я думаю, что вы хотите, это перестановка без повторения. Это упражнение можно решить рекурсивно (пример).

person Florian Lüdiger    schedule 14.02.2016
comment
Ну, мне нужно получить подмножества всех других размеров, поэтому я думаю, что мне нужна комбинация. - person CS-DS-ES-FS; 14.02.2016