Android搜索所有可能的单词。更快的方式?

时间:2013-03-07 14:34:51

标签: android search loops optimization

我需要优化搜索引擎。 通过制作所有可能的组合

,找到所有可能的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); 
    } 
}

1 个答案:

答案 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中。