Я делаю мобильное приложение, которое требует тысяч быстрых поисков строк и проверок префиксов. Чтобы ускорить это, я сделал Trie из своего списка слов, который насчитывает около 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