Я создаю мобильное приложение, которое нуждается в тысячах быстрых поисков строк и префиксных проверок. Чтобы ускорить это, я сделал Trie из списка моих слов, который имеет около 180 000 слов.
Все отлично, но единственная проблема заключается в том, что для создания этого огромного trie (у него около 400 000 узлов) требуется около 10 секунд на моем телефоне, что очень медленно.
Здесь код, который создает trie.
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;
}
Я ищу интуитивные методы для более быстрого создания trie. Может быть, я построю trie только один раз на своем ноутбуке, как-то его храню на диске и загрузим из файла в телефоне? Но я не знаю, как это реализовать.
Или существуют ли какие-либо другие структуры данных префикса, которые потребуют меньше времени на сборку, но имеют сходную сложность времени поиска?
Любые предложения приветствуются. Спасибо заранее.
ИЗМЕНИТЬ
Кто-то предложил использовать Java Serialization. Я попробовал, но с этим кодом было очень:
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;
}
}
Можно ли сделать этот выше код быстрее?
My trie: 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