2011-06-20 16 views
0

編輯:的Android - 優化啓動應用


我已經按照你的好建議,我已經使用了特里數據結構包含我dictionnary。我選擇的結構是this one感興趣的人民。

但是現在我又遇到了另一個問題:每次啓動我的應用程序時,我的trie數據結構的構建都太長了!也許我的字典太大了,或者我選擇的字典實現太不適合簡單的字典。

因此,即使在關閉應用程序(如註冊數據庫)之後,還是有一種方法來保存此結構,或者如果您認爲問題是由實現引起的,那麼您可以推薦我另一個嗎?


我對我的android項目有一個嚴重的問題。

這裏的目標是要計算所有可以用的6個字母

意甲進行的話要做到這一點,我有兩條表在我的BDD:

  • 「字」與兩列:'_id'和'mots'
  • 和'temp'臨時表 與相同的列。

「單詞」包含詞彙表的所有單詞(這是巨大的)和「臨時」包含的可與6個字母進行字母的所有可能的組合(至少使用3個字母)。

我試着在表中選擇'temp'這個詞,它是真正的,所以這個詞在表'詞'中。這裏是我的代碼來做到這一點:

我做的這包含佳信的話的第一選擇(至少3個字母的使用)

db.execSQL("CREATE TABLE temp2 (_id integer primary key autoincrement, mots text not null);"); 
db.execSQL("INSERT INTO temp2 (_id, mots) SELECT * FROM words WHERE mots like '%"+lettres.tab_char.get(0)+"%' OR mots like '%"+lettres.tab_char.get(1)+"%' " 
        + "OR mots like '%"+lettres.tab_char.get(2)+"%' OR mots like '%"+lettres.tab_char.get(3)+"%' OR mots like '%"+lettres.tab_char.get(4)+"%' " 
        + "OR mots like '%"+lettres.tab_char.get(5)+"%';"); 

(lettre.tab_char是一個ArrayList(漢字)其中包含用來在臨時組合)

我做一個表格「TEMP2」和「溫度」之間加入字母:

String MY_QUERY = "SELECT temp2._id, temp2.mots FROM temp2 INNER JOIN temp ON temp2.mots = temp.mots;"; 
Cursor test = db.rawQuery(MY_QUERY, null); 

之後,我把我的價值觀爲列表顯示。

它的作品,但它真的很慢:你能幫我嗎?

回答

1

一般來說,您使用的算法效率非常低。首先,您使用通配符匹配搜索每個條目6次,然後再次將您的整個數據集加入到這個巨大的結果中。

SQL可能不是正確的做法。 SQL擅長查詢,這更像是一個計算。在代碼中進行匹配。

您可以通過很多方法來完成此任務,但是找到正確的解決方案取決於您的要求。這些字母可以重複嗎?一個詞彙有多大是「巨大的」?它仍然適合幾MB?這種查找是否需要幾乎同時發生?

更新:

考慮您的要求,我跟喬同意。它實際上更像是一種數據結構,而不是一種算法,但是一種方法是可行的。您應該能夠在加載應用程序時構建一次trie,然後每個「匹配」將是一個相當簡單的查找,並沿着這個線程行進。

+0

首先,感謝您對你的興趣。事實上,我想設計一個基於字母的遊戲:你有6個字母,你必須輸入你可以用這些字母重新制作的所有單詞(字母只能按時使用)。 所以我有一個生成6個字母系列的算法。 我有我的詞彙表(379 000條目)和我用這個算法生成的組合表格:http://www.merriampark.com/comb.htm 這些SQL查詢是我發現的方法每個級別的解決方案。 – Paul

1

您正在查找的算法實際上稱爲「trie」(縮寫爲trie val)。他們是極其非常適合這種類型的計算(Android實際上在SMS和郵件應用中使用它們來執行諸如表情符號替換之類的事情)。如果正確完成,您會對可以從中獲得的性能感到驚訝。我同意保羅:你絕對不應該像你目前的查詢。事實上,許多實現甚至會將整個字典文件加載到內存中,並在整個應用程序的生命週期中使用該字典查找和驗證。拼字遊戲單詞列表(鏈接也包含在下面的問題中:twl06.zip)只有1.9MB,並且包含178k個單詞。內存中的trie實際上應該遠小於1.9MB,因爲多個單詞將共享公共前綴(例如,「stair」和「stare」將共享STA前綴,然後它將分支成兩個葉[「I」和「R」],等等...)

下面是一個良好的開端:Algorithm to generate anagrams

+0

謝謝你回答喬。如果我理解正確,你說我應該保留我的算法來生成我的字母組合,但是我應該使用trie數據結構(我的單詞列表)來測試生成的單詞。 – Paul