![]() |
|
![]() ![]() ![]() |
|
Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
Есть 2 обычных сбалансированных (красно-черных) бинарных дерева. Получены путем добавления ключей в пустые деревья. Есть ли быстрый способ найти разницу между ними, т.е. ключи которые есть в одном и нет в другом.
Приходит в голову только тупой способ: перебирать ключи в одном дереве и искать в другом... Куда копать? ![]() Спасибо. |
|||
|
||||
maxdiver |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 381 Регистрация: 29.1.2008 Где: Саратов Репутация: 16 Всего: 18 |
В красно-чёрных деревьях же значения упорядочены. Поэтому мы можем рассматривать эти два дерева просто как два отсортированных списка. Причём сам этот список в явном виде можно получить по дереву за линейное относительно числа вершин время (просто обходом по дереву).
А найти разницу между двумя отсортированными списками очень легко, опять же за линейное время. Это известный метод двух движущихся указателей: сначала оба указателя указывают на начала списков (первый-на первый список, второй-на второй). Потом, пока по одному указателю число меньше, чем по другому - этот указатель двигаем на 1 вправо, ответ увеличиваем на 1. Когда окажется, что по обоим указателям стоят одинаковые числа, оба указателя продвигаем вправо (как минимум на 1, ну или, если элементы в списках могут повторяться, то пока не встретим первый отличный от старого элемент). Ну и в самом конце могло оказаться, что один из указателей уже указывает за конец списка, а другой ещё нет - тогда в ответ добавляются все оставшиеся числа (от второго указателя и дальше). |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
Делаешь обход в ширину обоих деревьев результат заносим в массивы, а после сравниваем массивы за один проход.
В идеале совместить в один проход для этого рекурсию заменить циклом. |
|||
|
||||
niteo |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 23.11.2006 Где: Брянск Репутация: нет Всего: 1 |
Можно посмотреть разницу в объеме занимаемой памяти.
![]() Можно посчитать Контрольную сумму для каждого, или делать ето на моменте заполнения, а потом сравнить. Способов много есть, скажи для чего нада, мож что то конкретнее придумаем? ![]() Это сообщение отредактировал(а) niteo - 23.9.2009, 15:41 --------------------
Мне чужого лишнего не нада.Ешь ананасы, рябчиков жуй,день твой последний приходит, буржуй... |
|||
|
||||
Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
Всем спасибо!
maxdiver, просто как дважды два. То что надо! Держи +1. ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |