2013-04-08 4 views
4

Как построить дерево из файла? Я хочу, чтобы иметь возможность читать их из файла, а затем добавить к соответствующему уровнюtrie building in java

ответ

2

Мне кажется, что вы пытаетесь реализовать trie.

Посмотрите здесь для хорошей реализации в Java: http://www.cs.duke.edu/~ola/courses/cps108/fall96/joggle/trie/Trie.java

+0

Спасибо, человек, я посмотрю на него – Dodi

+0

очень полезно, решила моя проблема! – Dodi

+0

Im рад, что я мог бы помочь;) – ciastkoo

1

Добавление

Начиная с корня, поиска первого (или текущего) письма. Если эта буква найдена, перейдите на этот узел и выполните поиск следующей буквы. Если письмо не найдено, найдите слово, соответствующее текущей букве, если есть аналогичное слово, добавьте текущую букву в качестве нового узла и переместите оба слова под этим, иначе добавьте слово.

Примечание: Это приведет к тому, что дерево будет более оптимизировано для поиска, а затем дерево, показанное в примере. (Непреклонен и адаптируют будут сгруппированы под другим «а» узел)

Update: Посмотрите на статью Википедии для Trie

+0

@ user1747976 Вы первый поиск, где, чтобы добавить его, а затем добавить его. Если в дереве ничего нет, добавьте его. см. обновленный ответ. –

+0

Если вы ограничиваете это до двух уровней, это даст дерево, указанное в вопросе. –

+0

@ user1747976, если вы нажмете два уровня и используете только два уровня, он будет работать так же, как в примере. вам все равно придется искать правильный узел, чтобы добавить его (создав его, если необходимо) перед добавлением. –

1

Если у вас есть только два уровня в дереве до лаврового листа (фактическое слова), вы можете просто начать с массивов с 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]; 
    } 
} 

Похожие петли можно использовать для извлечения слов.

+0

@ user1747976, см. Мой обновленный ответ, убедитесь, что вы понимаете, что вы делаете, потому что я почти спал и исправил его уже два раза – akostadinov

+0

'letterInd()' дает вам указатель, который вы указали на букву (т. Е. Для «a «это вернет 1). 'letter (wordInd, word)' возвращает букву с индексом 'wordInd' в слово' word'. Он не создает новый объект, а новый массив или узел, если вы так его называете.UPDATE: Я вижу, что у вас есть класс Node, но было бы проще и меньше накладных расходов, чтобы не иметь отдельный класс узлов, но для этого использовать простой массив. В противном случае вы можете обернуть все в своем классе, в зависимости от того, как вы хотите что-то делать. Я просто дал вам пример цикла, чтобы добавить слово. – akostadinov

+0

@ user1747976, извините, скорректированный код – akostadinov