Эффективный метод для поиска перестановок с переменным числом массивов, содержащих varibale число элементов

Возможный дубликат:
   Как найти все перестановки, состоящие из 1 элемента из числа переменных массивов переменной длины?

Предположим, что у меня есть n массивов с элементами, как показано ниже

 a1 -> e11,e12,e13

 a2 -> e21,e22,e23,e24,e25

 a3 -> e31,e32

 a4 -> e41,e42,e43,e44

 ...

 an -> en1,en2,en3,en4,en5,en6

Я хочу получить все возможные перестановки с n элементами в нем из каждого массива выше.

Для примера.

 e11,e21,e31,e41.........,en1

 e13,e25,e32,e41.........,en6

и так далее...

Предложите мне эффективный метод и, если возможно, фрагмент кода в Java или C.

0
nl ja de
Я бы рекурсивно перебирал каждую комбинацию. Это просто и эффективно.
добавлено автор Peter Lawrey, источник

2 ответы

Вы можете использовать следующий псевдо-код:

Функция для следующей перестановки:

function NextPermutation(int[] current)
{
    current[0] = current[0] + 1;
    int pointer = 0;
    while(pointer <= n && current[pointer] == limit[pointer])
    {
        current[pointer] = 0;
        pointer = pointer + 1;
        current[pointer] = current[pointer] + 1;
    }
}

Предварительный код населения:

    int[] limit = new int[n + 2];
    int[] current = new int[n + 2];
    limit[1] = a1.length;
    ...
    limit[n] = an.length;

    while(current[n+1] == 0)
    {
        Print(current);
        NextPermutation(current);
    }

current array containt indexes into arrays a1, a2, ... , an.

0
добавлено

Поскольку вас интересуют все комбинации массивов. Для цикла будет отлично. Вот решение (должно быть модифицировано для синтаксиса, хотя для его работы)

int i = 0
int j=0
int k =0

while(i
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async