Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Балансировка троичного дерева сравнений 
:(
    Опции темы
Anark1
Дата 7.12.2008, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



Подскажите с алгоритмом балансировки троичного дерева сравнений. 
Изложу исходные условия. Так как в дереве элементы - фамилии, то логично сделать ключами буквы алфавита. Причем принять, что A<B<C<...<Z.
Тогда, считывая исходные данные вида :
Цитата

Vasiliev
Alexeev
Fedorov
Ivanov
Frolov


Получим что то вида (извиняйте что криво) :
                                                          
Цитата

                                                            Vasiliev (key = V)

                                      /                                   |                       \
                                Alexeev (key = A)              nil                      nil

              /                       |                       \                                                               
            nil                     nil                  Fedorov (key = F)

                                         /                             |                          \
                                        nil              Frolov (key = F)         Ivanov (key = I)


То есть если у добавляемого элемента первая буква фамилии совпадает с ключом, то он помещается в центр. если меньше, то в левое поддерево. если больше, то вправое. По-моему это самый очевидный  вариант. Если есть какой-то более удачный способ, то буду рад выслушать. Можно было бы попробовать использовать префиксное дерево, но задача именно изложена в троичном дереве.

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

Тип опишу на паскале, но если будет код на другом языке - разберусь.
Код

type PTree = ^Node;
        Node = record
        Left, Right, Centr : PTree;
        Key : char;
        Fam : String;
        Ballance : [-2..2] { << ? }
        end;

Заранее спасибо.

Это сообщение отредактировал(а) Anark1 - 7.12.2008, 15:19


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
maxdiver
Дата 7.12.2008, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 381
Регистрация: 29.1.2008
Где: Саратов

Репутация: 16
Всего: 18



Что-то ничего умного не приходит в голову (а ваша идея, что в центр класть вершину, у которой ключ равен - мне кажется, она неправильна для сбалансированного дерева, потому что никакой сбалансированности между тремя сыновьями каждой вершины в среднем не наблюдается).

В английском нете немного нашёл на эту тему (ключ "Ternary search tree"), и вот по ссылкам пришёл на статью Слетора и Тарьяна: Self-Adjusting Binary Search Trees (Sleator, Tarjan), там со страницы 23 идёт описание их link/cut tree, который, похоже, и есть сбалансированное троичное дерево.
PM MAIL WWW ICQ   Вверх
Anark1
Дата 7.12.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



maxdiver, добрался до этой статьи. Спасибо, уже что-то. Хотя он видится мне довольно тяжелой на подъем.
Я думаю, что должно быть что-нибудь попроще. Возможно, какой-то способ, основанной на условиях задачи. Я правильно понимаю, что сбалансированность означает по сути, что для каждого узла разница любых двух высот потомков равна -1,0,+1? Согласен, что в таком случае существуют небалансируемые деревья, но тогда как выбирать ключи, чтобы не терялся сам смысл использования деревьев?


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
Anark1
Дата 7.12.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



http://www.cs.ucr.edu/cs14/cs14_06win/slid...ees_covered.pdf
Самое интересное из того, что нашел. Не могу придумать как подобрать ключи... Проблема, что фамилии могут повторяться.

Добавлено через 2 минуты и 46 секунд
Если мой английский меня не подводит, то там написано, что 2-3 деревья гарантированно балансированы при правильном добавлении и удалении...


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
Anark1
Дата 7.12.2008, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

Репутация: нет
Всего: 11



Похоже нашел грамотную английскую статью. Если решу сабж, то выложу решение.


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0855 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.