2013-03-07 19 views
0

我需要優化一個搜索引擎。 什麼是找到所有可能的2到n個字母的單詞,通過使這樣的所有可能的組合Android搜尋所有可能的單詞。更快的方式?

(對於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

你的方法'checkIfIsWord'做什麼? – Thrakbad 2013-03-07 14:37:59

+0

看來你確實需要做一個遞歸函數。 http://danzig.jct.ac.il/java_class/recursion.html。另外'if(i == j)continue;'表示不允許「aa」,「bb」,「cc」的組合? – Timmetje 2013-03-07 14:39:57

+0

遞歸不會真的加速這個過程,它只會使代碼更易於維護和閱讀 – Thrakbad 2013-03-07 14:42:12

回答

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 agains目前words所有條目。這就是.contains()內部所做的。這意味着您的結果列表allWords中只能存儲words中存儲的值的子集。更快的實現肯定是以下幾點:

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

現在如果你說用16K條目的字符串數組會消耗大量的內存,這是正確的。但是,您的原始解決方案存在同樣的問題,因爲標記爲(1)的行只允許已在列表words中的單詞成爲結果集的一部分。如果你想解決這個問題,我建議將這些單詞移到數據庫中,而不是將它們全部放在RAM中。

+0

這將不會使其更快。 對於7個字母的單詞,例如大約有16000個字 使用我的方法需要7 * 6 * 5 * 4 * 3 * 2 = 5040個支票 – user2144587 2013-03-07 14:54:10

+0

實際上,是的,它將使用 – Timmetje 2013-03-07 14:54:48

+0

@ user2144587目前,在你的16000個預定義詞中,大約有8000萬個比較。如果您只檢查預定義的單詞,那麼您只需檢查一次即可。 – Thrakbad 2013-03-07 14:59:32