Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.30;
Скачать: CL | DM;

Вниз

Помогите решить задачу, пожалуйста!   Найти похожие ветки 

 
Lip   (2007-12-01 00:47) [0]

Есть слова:
abc
abb
add
adc
bcd

Нужно построить дерево вида:
a-
|
-b-
| |
| -b
| |
| -c
|
-d-
| |
| -c
| -d
|
b-
|
-c-
|
-d

Должен соблюдаться алфавитный порядок.

Примерный алгоритм такой:
-вводим слова
-сортируем
-ну и самое сложное - выводим это дерево

Вот сижу мучаюсь пытаюсь реализовать вывод дерева. Что-то не получается, мозгов не хватает.
Решил что можно рекурсией реализовать это, но как написать пока не понял.
Не прошу писать за меня и т.д.
Помогите советов чтоль, как вот рекурсией это сделать если это вообще можно. Мне кажется рекурсией будет легче.
Заранее благодарен!


 
Servelat   (2007-12-01 02:14) [1]

Почему в конце твоего дерева-примера "c" на одном уровне с "d"? Вроде слов "bc" и "bd" небыло, а было лишь "bcd".

В предположении, что ты ошибся с примером, ход построения дерева мог бы быть таким:

for I := 0 to WordCount - 1 do
begin
 CurrentTreeNode := Root;
 for J := 1 to Length(Words[I]) do
 begin
   if <буква Words[I][J] есть среди списка дочерних узлов CurrentTreeNode> then
     CurrentTreeNode := <тот самый дочерний узел, буква которого совпадает с CurrentTreeNode>
   else
   begin
     <добавить дочерний узел к CurrentTreeNode, присвоив ему букву Words[I][J]>;
     CurrentTreeNode := <только что добавленный дочерний узел>;
   end;
 end;
end;


Words - массив отсортированных слов.
CurrentTreeNode - текущий узел
Root - корневой узел (от которого мы строим все дерево).


 
Сергей М. ©   (2007-12-01 12:29) [2]


> Нужно построить дерево


Дерево обычно сажают, выращивают и строгают, а не "строят".

Определись для начала со значением фразы "посторить дерево" ..


 
Efir   (2007-12-01 13:03) [3]

Что-то на дерево для реализации алгоритма LZ смахивает.


 
TUser ©   (2007-12-01 16:07) [4]

Не надо сортировать слова. Тебе нужно префиксное дерево. Его строят так

for every word
 PLACE = root of the tree
 for L = first letter to last letter
   if PLACE has no child for letter L then
     add the child for PLACE
   PLACE = a child of PLACE for letter L


 
Servelat   (2007-12-01 17:41) [5]


> [4]


Если не сортировать слова, то надо не "add the child for PLACE" делать, а скорее "insert the child for PLACE in appropriate position", иначе нарушится пожелание автора сабжа

> Должен соблюдаться алфавитный порядок.


Кстати, при предварительной алфавитной сортировке слов, упрощается проверка условия (PLACE has no child for letter L) - искомый узел может быть только последним => можно проверять только последний дочерний узел из списка дочерних узлов.

Впрочем, это все детали, реализаций множество (=.



Страницы: 1 вся ветка

Текущий архив: 2007.12.30;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.017 c
15-1196191309
Anatoly Podgoretsky
2007-11-27 22:21
2007.12.30
Заветы, советы и КИ и тормоза


2-1196706403
BD
2007-12-03 21:26
2007.12.30
Поиск в базе данных (MS Access)


2-1196612331
@!!ex
2007-12-02 19:18
2007.12.30
Частый вызов SetLength(Count+10)


2-1196848004
Тест_Новичок
2007-12-05 12:46
2007.12.30
Как сохранить результат SQL запроса в файл?


15-1196438884
QWE
2007-11-30 19:08
2007.12.30
Хочется поучаствовать в разработке реального проекта