0

検索エンジンを最適化する必要があります。このように可能なすべての組み合わせを作成することにより、可能な2〜n文字の単語をすべて見つけることができます。

(2文字の単語の場合)w =任意の文字を1番目の文字のスポットに配置できます+任意の文字を2番目のスポットに残します(ただし1番目の文字を除く)。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); 
    } 
}
4

1 に答える 1

1

コメントから収集したように、定義済みの文字列のリストがある場合は、逆にチェックする必要があります。リスト内のすべての単語を繰り返し処理し、条件に一致する単語を保存します。これには線形の複雑さしかありません。

あなたの方法でcheckIfIsWord

void checkIfIsWord(String w) 
{ 
    if (w.length() > 2 
        && words.contains(w.toLowerCase()) // (1) 
        && !allWords.contains(w)) 
    { 
        allWords.add(w); 
        runOnUiThread(updateMaxWords); 
    } 
}

でマークされた行は、現在のすべてのエントリに対して(1)現在の単語をチェックします。それが内部で行うことです。これは、結果リストでは、 に格納されている値のサブセットのみを持つことができることを意味します。より高速な実装は、間違いなく次のようになります。wwords.contains()allWordswords

for(String word : words)
{
    if(word.length() > 2
       && word.length() < n)
    {
        allWords.add(word);
        runOnUiThread(updateMaxWords);
    }
}    

16k のエントリを持つ String 配列が多くのメモリを消費するというのであれば、これは正しいです。ただし、元のソリューションでも同じ問題があります。 でマークされた行で(1)は、リストに既に存在する単語のみがwords結果セットの一部になることが許可されるためです。この問題に取り組みたい場合は、単語をすべて RAM に保持するのではなく、データベースに移動することをお勧めします。

于 2013-03-07T14:50:40.197 に答える