何千もの高速な文字列検索とプレフィックス チェックを必要とするモバイル アプリを作成しています。これをスピードアップするために、約 180,000 語の単語リストからトライを作成しました。
すべてが素晴らしいのですが、唯一の問題は、この巨大なトライ (ノード数は約 400,000) を構築するのに、現在私の電話で約10 秒かかり、非常に遅いことです。
トライを構築するコードは次のとおりです。
public SimpleTrie makeTrie(String file) throws Exception {
String line;
SimpleTrie trie = new SimpleTrie();
BufferedReader br = new BufferedReader(new FileReader(file));
while( (line = br.readLine()) != null) {
trie.insert(line);
}
br.close();
return trie;
}
insert
で実行されるメソッドO(length of key)
public void insert(String key) {
TrieNode crawler = root;
for(int level=0 ; level < key.length() ; level++) {
int index = key.charAt(level) - 'A';
if(crawler.children[index] == null) {
crawler.children[index] = getNode();
}
crawler = crawler.children[index];
}
crawler.valid = true;
}
トライをより速く構築するための直感的な方法を探しています。ラップトップで一度だけトライをビルドし、何らかの方法でディスクに保存し、電話のファイルからロードしますか? しかし、これを実装する方法がわかりません。
または、構築に時間がかからず、同様の検索時間の複雑さを持つ他のプレフィックスデータ構造はありますか?
任意の提案をいただければ幸いです。前もって感謝します。
編集
誰かが Java シリアライゼーションの使用を提案しました。私はそれを試しましたが、このコードでは非常に遅かったです:
public void serializeTrie(SimpleTrie trie, String file) {
try {
ObjectOutput out = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(file)));
out.writeObject(trie);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public SimpleTrie deserializeTrie(String file) {
try {
ObjectInput in = new ObjectInputStream(new BufferedInputStream(new FileInputStream(file)));
SimpleTrie trie = (SimpleTrie)in.readObject();
in.close();
return trie;
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
return null;
}
}
この上記のコードを高速化できますか?
私の試み: http://pastebin.com/QkFisi09
単語リスト: http://www.isc.ro/lists/twl06.zip
コードの実行に使用される Android IDE: http://play.google.com/store/apps/details?id=com.jimmychen.app.sand