Как построить дерево из файла? Я хочу, чтобы иметь возможность читать их из файла, а затем добавить к соответствующему уровнюtrie building in java
ответ
Мне кажется, что вы пытаетесь реализовать trie.
Посмотрите здесь для хорошей реализации в Java: http://www.cs.duke.edu/~ola/courses/cps108/fall96/joggle/trie/Trie.java
Добавление
Начиная с корня, поиска первого (или текущего) письма. Если эта буква найдена, перейдите на этот узел и выполните поиск следующей буквы. Если письмо не найдено, найдите слово, соответствующее текущей букве, если есть аналогичное слово, добавьте текущую букву в качестве нового узла и переместите оба слова под этим, иначе добавьте слово.
Примечание: Это приведет к тому, что дерево будет более оптимизировано для поиска, а затем дерево, показанное в примере. (Непреклонен и адаптируют будут сгруппированы под другим «а» узел)
Update: Посмотрите на статью Википедии для Trie
@ user1747976 Вы первый поиск, где, чтобы добавить его, а затем добавить его. Если в дереве ничего нет, добавьте его. см. обновленный ответ. –
Если вы ограничиваете это до двух уровней, это даст дерево, указанное в вопросе. –
@ user1747976, если вы нажмете два уровня и используете только два уровня, он будет работать так же, как в примере. вам все равно придется искать правильный узел, чтобы добавить его (создав его, если необходимо) перед добавлением. –
Если у вас есть только два уровня в дереве до лаврового листа (фактическое слова), вы можете просто начать с массивов с 28 элементами, являющимися и перевести буквы в индекс (т.е. a == 1, b == 2 и т. д.). Элементами массива могут быть некоторые set/list, содержащие полные слова. Вы можете лениво создавать массивы и списки (т. Е. Создавать корневой массив, но иметь нули для других массивов и список слов, тогда вы создаете массив/список при необходимости, если это необходимо).
Я читаю правила, которым вы должны следовать правильно?
P.S. Я думаю, что использование массивов с полным размером каждого из них не было бы слишком расточительным на пространстве, а также должно быть очень быстро, чтобы обратиться к
Обновление: @ user1747976, и каждый массив будет занимать около 28 * 4 или 28 * 8 бит + 12 байты overhead. Надеемся, вы используете сжатые операционные системы, поэтому это 28 * 4 + 12 = 116 байтов на массив. Теперь это зависит от того, хотите ли вы эффективно использовать память или эффективно работать. Чтобы быть эффективной с памятью, вы можете использовать какой-то хэш-файл вместо массивов, но я не уверен, что дополнительные накладные расходы будут меньше, чем то, что вы используете с массивами. Тем не менее, обработка будет еще хуже. Вам нужно использовать несколько умных циклов несколько раз в зависимости от требования к дереву. Некоторые некрасиво псевдо-код для вставки в дерево:
root=new Object[28];
word="something";
pos = root;
wordInd=1;
for (int i=1; i<=TREE_DEPTH ; i++) {
targetpos = letterInd(letter(wordInd,word));
if (i==TREE_DEPTH) {
if (pos[targetpos] == null) pos[targetpos] = new HashSet<String>();
(Set) pos[targetpos].add(word);
break;
} else {
if (pos[targetpos] == null) pos[targetpos] = new Object[28];
wordInd++;
pos = pos[targetpos];
}
}
Похожие петли можно использовать для извлечения слов.
@ user1747976, см. Мой обновленный ответ, убедитесь, что вы понимаете, что вы делаете, потому что я почти спал и исправил его уже два раза – akostadinov
'letterInd()' дает вам указатель, который вы указали на букву (т. Е. Для «a «это вернет 1). 'letter (wordInd, word)' возвращает букву с индексом 'wordInd' в слово' word'. Он не создает новый объект, а новый массив или узел, если вы так его называете.UPDATE: Я вижу, что у вас есть класс Node, но было бы проще и меньше накладных расходов, чтобы не иметь отдельный класс узлов, но для этого использовать простой массив. В противном случае вы можете обернуть все в своем классе, в зависимости от того, как вы хотите что-то делать. Я просто дал вам пример цикла, чтобы добавить слово. – akostadinov
@ user1747976, извините, скорректированный код – akostadinov
- 1. Создать trie in perl
- 2. Suffix Trie in C++
- 3. Spaceleak in Haskell trie
- 4. Trie Implementation in C++
- 5. Trie tree crashing in Android
- 6. Building gradle in eclipse
- 7. Building gtk + in eclipse
- 8. Shortest Path in a Trie
- 9. Trie datastructure в Java
- 10. Building Comriva in android Studio
- 11. Java Trie Optimization
- 12. построить trie JAVA
- 13. Trie - Реализация в java
- 14. A Trie to Patricia Trie
- 15. mupdf not building in xcode
- 16. Building Python in Sublime Text
- 17. String Building Issue in Powershell
- 18. Java Regex building
- 19. Trie in C. Рекурсивная вставка неправильной работы
- 20. Соответствие префикса/trie для Java?
- 21. Автозаполнение с использованием Trie в Java
- 22. Port install ruby stuck in Building gettext
- 23. Building XNA solution (in VS2010) freezes
- 24. apache ignite building in linux для C++
- 25. Building hadoop mapreduce in Eclipse indigo
- 26. java.lang.NullPointerException in session factory building hibernate 4
- 27. Java Trie Matching с использованием Iterator
- 28. Создание структуры данных Trie в Java - NullPointerException
- 29. Trie implementation
- 30. Построение префикса Trie в C++, Suffix Trie
Спасибо, человек, я посмотрю на него – Dodi
очень полезно, решила моя проблема! – Dodi
Im рад, что я мог бы помочь;) – ciastkoo