![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Stream |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
Подскажите, как можно реализовать объединение двух Б деревьев.?!
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
а это от задачи зависит... можно тупо создать одну общую родительскую ноду к которой прилепить оба дерева...
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Stream |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
Каждое дерево находится в отдельном файле, затем новое располагается также в одном файле.
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
и что?
-------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| Stream |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
"И что ?" написано немного ранее, если кто-то ещё не заметил.
|
|||
|
||||
| blackofe |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 173 Регистрация: 29.11.2005 Репутация: 4 Всего: 4 |
под "и что?", имхо, подразумевалось: "считай одно дерево из одного файла, считай другое дерево из другого файла, создай ноду, прилепи к нему оба считанных дерева и сохрани полученное общее дерево в третий файл".
так доступно? |
|||
|
||||
| Stream |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
такой вопрос: "А определение Б дерева вы хоть знаете, а то, что оно сбалансированное вам не о чём не говорит?".
|
|||
|
||||
| Guest |
|
|||
|
Unregistered |
я думаю супер эффективный merge это на докторскую потянет... a на пальцах:
каждый нод создается на основе предыдущих данного дерева. поэтому в общем случае ты не можешь надеяться, что сохраняется неравенство {n1_i < n2_j: по всем i в t1 и j в t2 } (т.е. все ветви t1 меньше, чем все ветви t2) т.е. нужно найти индексы in1,in2,in3,in4...in5 для превращения деревьев t1,t2 в Т, так что t1,t2 - отдельные ветки этого B-tree, а это невозможно. поэтому по моему тебе надо: выбрать дерево побольше и к нему то что поменьше нод за нодом вставлять. в принципе, если дерево не содержит своей величины, то придется тебе надеяться на авось, потому что меньшее дерево определить и вставить займет 2*О(|t_min|), a просто вставить одно в другое O(|вставляемое дерево|) времени. вопрос что дольше: 2*О(|t_min|) или O(|вставляемого дерева|) если же величина известна, то вставляй меньшее в большее. у тебя файлы. если оба дерева - в файлах, и информация - числовая, то можно предположить, что величина файла указывает на величину дерева, и этим воспользоваться для "интеллигентного" угадывания. |
|||
|
||||
| Stream |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
А если выбрать дерево с наибольшей степенью вершин, а затем просто дабовлять в него ключи второго дерева?
Или это ерунда? |
|||
|
||||
| dwr_budr |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 11.4.2004 Репутация: нет Всего: 2 |
Если предположить что входные деревья были построенны по правилу типа "большее число вправо, меньшее число влево", то в лоб можно сделать вот так:
1. Из каждого из деревьев получить по отсортированному массиву за O(n) 2. Из 2х отсортированных массивов сделать один за O(n) 3. Отсортированный массив запихнуть в новое дерево за O(nlogn). Запихивать надо понятное дело с умом. Центральный элемент массива - корень. Цетральный элемент правого подмассива - правый потомок. Центральный элемент левого подмассива - левый потомок. И т.п. В итоге получим сбалансированное выходное дерево за O(nlogn). Если же входные деревья просто бинарые и не используют никаких правил для построения (кроме того что у каждой ноды по два потомка), то в первый шаг нужно еще добавть сортировку выходных массивов руками. |
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
http://www.semaphorecorp.com/btp/algo.html
Добавлено @ 14:14 Думаю будет полезно Добавлено @ 14:16 глянька сюда: http://cis.stvincent.edu/carlsond/swdesign/btree/btree.html -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
там не написано про сбалансированность.
согласен. особенно если учесть твои ( MastEdm ) и твои ( Stream ) посты. -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: 4 Всего: 6 |
Hарод что же вы так ..., смотрели хоть те ссылки которые приведены ?
Там же реализация тоже прилагается. http://cis.stvincent.edu/carlsond/swdesign/btree/btree.html -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
| Stream |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 29.10.2005 Репутация: нет Всего: нет |
Большое спасибо за ссылку, но в Кормене всё выглядит намного понятнее.............
Я ведь спрашиваю не про реализацию Б дерева (добавление, удаление и тд - это мне понятно), а конкретно про объединение двух таких деревьев, причём я бы хотел получить просто идею, а уж реализовать я попытаюсь сам. |
|||
|
||||
| Guest |
|
|||
|
Unregistered |
Stream я на первой странице вроде как изложил рабочую идею.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |