Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстро найти разницу между бинарными деревьями 
V
    Опции темы
Ch0bits
Дата 23.9.2009, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Есть 2 обычных сбалансированных (красно-черных) бинарных дерева. Получены путем добавления ключей в пустые деревья. Есть ли быстрый способ найти разницу между ними, т.е. ключи которые есть в одном и нет в другом.
Приходит в голову только тупой способ: перебирать ключи в одном дереве и искать в другом... Куда копать?  smile 
Спасибо.
PM WWW   Вверх
maxdiver
Дата 23.9.2009, 14:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

А найти разницу между двумя отсортированными списками очень легко, опять же за линейное время. Это известный метод двух движущихся указателей: сначала оба указателя указывают на начала списков (первый-на первый список, второй-на второй). Потом, пока по одному указателю число меньше, чем по другому - этот указатель двигаем на 1 вправо, ответ увеличиваем на 1. Когда окажется, что по обоим указателям стоят одинаковые числа, оба указателя продвигаем вправо (как минимум на 1, ну или, если элементы в списках могут повторяться, то пока не встретим первый отличный от старого элемент). Ну и в самом конце могло оказаться, что один из указателей уже указывает за конец списка, а другой ещё нет - тогда в ответ добавляются все оставшиеся числа (от второго указателя и дальше).
PM MAIL WWW ICQ   Вверх
Pavia
Дата 23.9.2009, 14:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Делаешь обход в ширину обоих деревьев  результат заносим в массивы, а после сравниваем массивы за один проход.

В идеале совместить в один проход для этого рекурсию заменить циклом. 
PM MAIL   Вверх
niteo
Дата 23.9.2009, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Можно посмотреть разницу в объеме занимаемой памяти. smile 
Можно посчитать Контрольную сумму для каждого, или делать ето на моменте заполнения, а потом сравнить.
Способов много есть, скажи для чего нада, мож что то конкретнее придумаем? smile

Это сообщение отредактировал(а) niteo - 23.9.2009, 15:41
--------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй...
PM MAIL   Вверх
Ch0bits
Дата 23.9.2009, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Python Dev.
****


Профиль
Группа: Завсегдатай
Сообщений: 2124
Регистрация: 21.2.2005
Где: Казань

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



Всем спасибо!


maxdiver, просто как дважды два. То что надо! Держи +1.  smile 
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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