Мне нужно управлять почти 1,300,000 словами (некоторые группы слов похожи). Я делаю что-то вроде небольшой лексики, где каждое слово имеет свое описание. Быстрый поиск по лексике необходим. Поэтому я решил использовать дерево префикса. Во-первых, дерево preffix необходимо для создания (это медленный процесс, я знаю это), после того как этот быстрый поиск по лексике может быть организован.Проблема дерева префикса
Но моя проблема - это дерево префикса строится крайне медленно (первые 300 000 слов строятся быстро, но построение хвоста очень медленное, настолько медленное, что я не мог дождаться, пока дерево будет построено !!).
Вот мой префикс дерева класс:
public class InverseVocabularyTree implements Serializable
{
private HashMap<Character, InverseVocabularyTree> childs;
private String description;
public InverseVocabularyTree() {
childs=new HashMap<Character, InverseVocabularyTree>();
}
public void addWord(String word, String description){
InverseVocabularyTree tr=this;
InverseVocabularyTree chld=this;
char[] letters=word.toCharArray();
for (int i=word.length()-1; i>=0; i--) {
if (!tr.childs.containsKey(letters[i]))
{
for(int j=i; j>=0; j--) //a small optimisation..
{
chld=new InverseVocabularyTree();
tr.childs.put(letters[j], chld);
tr=chld;
}
break;
}
else
tr=tr.childs.get(letters[i]);
}
tr.description=description;
return;
}
public HashMap<Character, InverseVocabularyTree> getChilds() {
return childs;
}
public String[] getRemovableBasicParts() {
return removableBasicParts;
}
public LinkedList<String[]> getAllRemovableBasicParts() {
LinkedList<String[]> ret=new LinkedList<String[]>();
if (removableBasicParts!=null)
ret.add(removableBasicParts);
if (childs.keySet().isEmpty())
return ret;
for(char c : childs.keySet())
ret.addAll(childs.get(c).getAllRemovableBasicParts());
return ret;
}
}
Так ли кто-нибудь некоторые идеи или советы, как оптимизировать в этой ситуации?
Методы getRemovableBasicParts() и getAllRemovableBasicParts() являются излишними. – stemm
Вы проверяли эффекты сбора мусора? – jmg
Да, если пользователь спрашивает лексику, чтобы получить описание какого-либо слова, то не в словарной программе - программа покажет ему самое похожее слово (так что это выглядит как нечеткий поиск ..) и дерево префикса решают эту проблему хорошо (я hoope :) – stemm