java - 获取所有辅音和元音组合的方法,该方法消耗足够的内存

标签 java algorithm memory logic combinations

我要解决的问题是使用辅音和元音创建所有可能的单词,其中我有两个数组列表:

第一个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));
     }

我的问题是,由于单词数很大,当我的方法通过'for'时,我不可能完成这样的计算,因为该方法消耗的内存比我多。 有什么方法可以改进这个算法吗?有人可以帮我解决这个问题吗?

最佳答案

不需要存储这些“词”。

您有 105 个不同的音节,您可以将这些单词视为以 105 为基数的数字。根据您要执行的处理,您可以将音节编码为字节(然后对于完整的枚举,每次“数字”超过 104 时都必须携带)或整数(并提供基本转换算法)。在这两种情况下,32 位整数都可以表示最多四个音节的任何单词。

但同样,显式存储它们是没有用的。如果确实需要,请使用位数组。表示四个音节的单词大约需要 15.2 MB。

关于java - 获取所有辅音和元音组合的方法,该方法消耗足够的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53581539/

相关文章:

java - 使用 ConcMarkSweepGC 的连续 CMS 收集

java - 通过SBT中的https访问Maven repo

java - gradle bootRun成功启动,但一段时间后断开连接

java - Android Studio 依赖项不兼容

Python 链表 O(1) 插入/删除

c - 在函数中使用 malloc 分配内存,段错误

c# - 扫描 64 位内存?

java - Jetty 服务器停止后留下线程

arrays - 如何在多个数组中找到连续的数字?

algorithm - Neo4J - 旅行推销员