我需要优化搜索引擎。 通过制作所有可能的组合
,找到所有可能的2到n个字母的单词是做什么的(对于2个字母的单词)w =任何字母都可以在第一个字母的地方+第二个地方留下的任何字母(但是第一个字母); checkIfIsWord(w)的
(对于n个字母的单词)n1 + n2 + n3 + n4 + ... n; checkIfIsWord(w)的
这是有效的,但是非常耗时。 请帮助我了解如何加快速度!
以下是代码:
String w = "";
for (int i = 0; i < letters.length; i++)
{
for (int j = 0; j < letters.length; j++)
{
if (i == j) continue;
w = "" + (char) letters[i] + (char) letters[j];
checkIfIsWord(w);
for (int k = 0; k < letters.length; k++)
{
if (i == k || j == k) continue;
w = "" + (char) letters[i] + (char) letters[j] + (char) letters[k];
checkIfIsWord(w);
for (int m = 0; m < letters.length; m++)
{
if (i == m || j == m || j == m || k == m) continue;
w = "" + (char) letters[i] + (char) letters[j] + (char) letters[k] + (char) letters[m];
checkIfIsWord(w);
...
}
}
}
}
方法checkIfIsWord
void checkIfIsWord(String w)
{
if (w.length() > 2
&& words.contains(w.toLowerCase()) // (1)
&& !allWords.contains(w))
{
allWords.add(w);
runOnUiThread(updateMaxWords);
}
}
答案 0 :(得分:1)
如果您有一个预定义字符串列表,正如我从您的评论中收集的那样,您应该反过来查看它。迭代列表中的所有单词并存储符合条件的单词。这只会有线性的复杂性。
在您的方法checkIfIsWord
中:
void checkIfIsWord(String w)
{
if (w.length() > 2
&& words.contains(w.toLowerCase()) // (1)
&& !allWords.contains(w))
{
allWords.add(w);
runOnUiThread(updateMaxWords);
}
}
标有(1)
的行会再次检查w
中当前所有条目的当前单词words
。这就是.contains()
内部的作用。这意味着在结果列表allWords
中,您只能存储words
中存储的值的子集。更快的实现肯定如下:
for(String word : words)
{
if(word.length() > 2
&& word.length() < n)
{
allWords.add(word);
runOnUiThread(updateMaxWords);
}
}
现在,如果您说具有16k条目的String数组会消耗大量内存,那么这是正确的。但是您的原始解决方案存在同样的问题,因为标有(1)
的行只允许列表words
中已有的单词成为结果集的一部分。如果你想解决这个问题,我建议将这些词移到数据库中,而不是将它们全部保存在RAM中。