Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск наибольшего общего под дерева 
:(
    Опции темы
endryha
Дата 16.3.2010, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите пожалуйста алгоритм позволяющий найти наибольшее общее поддерево в двух сравниваемых деревьях.

Вот например есть дерево номер 1:

                1
                 |\
                 | \
                2  \
                /\   3
               /  \
              4   5

И дерево номер два:


                1
                 |\
                 | \
                2  \
                     3
                      |
                      4

У них наибольшим общим поддеревом будет дерево:


                1
                 |\
                 | \
                2  \
                     3

Подскажите кто знает.
PM MAIL   Вверх
skyboy
Дата 16.3.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



насколько я понимаю, можно применить для этого алгоритм Дж. Эдмонда проверки графов на изоморфность.
описание есть в википедии
я, правда, не уверен, один ли и тот же алгоритм описан по первой ссылке и по второй. лучше посмотри оба источника.
PM MAIL   Вверх
maxdiver
Дата 18.3.2010, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Деревья подвешены заранее? Тогда можно решить за O(N log N) с помощью хеширования. С теоретической точки зрения метод не очень хорош, но на практике работает отлично. Если интересует, могу подробнее.
PM MAIL WWW ICQ   Вверх
endryha
Дата 21.3.2010, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(maxdiver @ 18.3.2010,  22:55)
Деревья подвешены заранее? Тогда можно решить за O(N log N) с помощью хеширования. С теоретической точки зрения метод не очень хорош, но на практике работает отлично. Если интересует, могу подробнее.

Интересно, если можно подробнее.
PM MAIL   Вверх
maxdiver
Дата 21.3.2010, 23:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Научимся считать хеш от поддерева (т.е. от вершины вместе со всеми её сыновьями, их сыновьями, и т.д.). Причём хеш сделаем таким образом, чтобы он не зависел от порядка указания сыновей вершины, ну и естественно от их нумерации.

Итак, хеш. От единственной вершины, без сыновей, положим его равным 1. Пусть теперь у вершины есть сыновья. Тогда посчитаем (рекурсивно) хеш от каждого из этих сыновей, отсортируем их (тем самым мы устранили зависимость от порядка указания вершин в списке сыновей), и теперь хеш нашей вершины положим равным:
1 + P * son[1] + P^2 * son[2] + P^3 * son[3] + ...
где son[i] - хеш от i-го сына (в порядке сортировки), P - некоторое число, скажем, 97 (если степени вершин большие, больше этого числа, то имеет смысл поставить побольше).

Ну и собственно всё. Два поддерева совпадают, тогда совпадают и их хеши. Если хеши совпадают, то совпадают и поддеревья, _наверное_ (здесь проявляется ненадёжная природа хешей).


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


P.S. За точность не ручаюсь, вроде бы правильно. Такой метод один раз применял на практике, работал отлично (ни одной коллизии не поймал).
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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