Метод получения всех комбинаций согласных и гласных, метод, потребляющий достаточно памяти - PullRequest
0 голосов
/ 02 декабря 2018

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

Первый A = {a, e, i, o, u}, составленный только из гласных.Вторые B = {b, c, d, f, g, h, j, k, l, m, n, p, q, r, t, v, x, y, w, z}, ведут себя согласными.

С этими двумя мне нужно сгенерировать все возможные комбинации слов, используя согласную и гласную, например:

01 - babebi, 02 - babebu ...

И используятретий массив, мне нужно добавить числовое значение в конец каждого слова со следующим списком массивов: C = {0,1,2,3,4,5,6,7}, где можно будет использовать только два алгоритма, например:

01 - babebi01, 02 - babebi02, 03 - babebi03 ... безповторяющиеся числа и для всех слов.

Для этого у меня есть следующий код:

С помощью этого метода я генерирую все слова, используя согласные и гласные:

Где я генерирую всепары, согласный и гласный.

private void getRandomPairs(Values obj) {

        for (String vowel: obj.getVowels()) {
            for (String consonat: obj.getConsonants()) {
                pairsLetters.add(consonat + vowel);
            }
        }
}

Затем со всеми парами, сохраненными в списке, я генерирую все слова.

private List<String> generateWord() {

        for (int i = 0; i < pairsLetters.size(); ++i){

            for (int j = 0; j < pairsLetters.size(); ++j){

                if (pairsLetters.get(i).equals(pairsLetters.get(j))) continue;

                for (int k = 0; k < pairsLetters.size(); ++k){

                    if ((pairsLetters.get(i).equals(pairsLetters.get(k))) || (pairsLetters.get(j).equals(pairsLetters.get(k)))) continue;

                    words.add(pairsLetters.get(i) + pairsLetters.get(j) + pairsLetters.get(k));

                }
            }
        }

        return words;
    }

С помощью этого другого метода я генерирую все возможные комбинациичисел без повторения с использованием двух алгоритмов:

private void generateNumbersPairs(Values obj) {

        for (int i = 0; i < obj.getNumbers().size(); ++i){

            for (int j = 0; j < obj.getNumbers().size(); ++j){

                if (obj.getNumbers().get(i).equals(obj.getNumbers().get(j))) continue;

                    pairNumbers.add(obj.getNumbers().get(j)+obj.getNumbers().get(i));
                    pairNumbers.add(obj.getNumbers().get(i)+obj.getNumbers().get(j));

            }
        }

    }

Это сделано, и используется этот метод для генерации всех комбинаций слов с номером значения в конце:

Генерация слов

private void getAllWords (List <String> words, List <String> pairNumbers) {
         for (int letter = 0; letter <6; ++ letter) {

             for (int number = 0; number <pairNumbers.size (); ++ number) {

                 if (words.equals (pairNumbers.get (number))) continue;

                 saveNewWord (words, pairNumbers, number);

             }
         }
     }

Сохранение слов

     private void saveNewWord (List <String> pairs, List <String> pairNumbers, int number) {
         String word = String.join ("", words);

         allWords.add (word + pairNumbers.get (number));
     }

Моя проблема в том, что, поскольку количество слов огромно, когда мой метод проходит через «для», я не могу выполнить такой расчет,потому что метод потребляет больше памяти, чем у меня.Был бы какой-нибудь способ улучшить этот алгоритм?Может ли кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 02 декабря 2018

Нет необходимости хранить эти "слова".

У вас есть 105 различных слогов, и вы можете видеть слова в виде чисел-105.В зависимости от обработки, которую вы хотите выполнить, вы можете кодировать слоги в байтах (тогда для полного перечисления вы должны переносить каждый раз, когда «цифра» превышает 104), или на целых числах (и предоставлять базовый алгоритм преобразования).В обоих случаях 32-разрядные целые числа могут представлять любое слово, содержащее до четырех слогов.

Но опять же, их явно не нужно хранить.Если вам действительно нужно, используйте битовый массив.Представление четырех слоговых слов займет около 15,2 МБ.

...