我要解决的问题是使用辅音和元音创建所有可能的单词,其中我有两个数组列表:
第一个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/