powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как найти все листья в бинарном дереве по заданной точке
14 сообщений из 14, страница 1 из 1
как найти все листья в бинарном дереве по заданной точке
    #39788420
Фотография YuriyB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

структура данных показана на картинке.
данные ввида

id, parent_id, upline_id, left , rigth
где parent_id верзний родитель, upline_id на родитель 1 уровня,
left , rigth нижние ноды.

вот если известна нода 3, как быстрее всего можно найти листья? на рисунке указаны знаком "?"

может быть много уровней, поэтому пошаговым перебором будет долго
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788452
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuriyB,

Делаешь Nested Sets модель и там будет элементарный запрос типа
Код: sql
1.
2.
3.
    ...
    WHERE right = left + 1
    AND [условие для твоей известной ноды]
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788453
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дерево - несортированное?
Какая версия MySQL?
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788468
Фотография YuriyB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

автор
Дерево - несортированное?
Какая версия MySQL?



версия последняя.
дерево постоянно растущее, новые ноды добавляется вниз.
к примеру, нода 3 , пригласила новую точку, и ее нужно бросить , где то внизу, но в ветке ноды 3
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788494
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuriyBверсия последняя.А цифру написать - трудно, что ли?

YuriyBдерево постоянно растущее, новые ноды добавляется вниз.Я спрашивал о том, сортированное дерево или нет.

Пробуй

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
WITH RECURSIVE 
cte AS ( SELECT id, parent_id, upline_id, left , rigth
         FROM tree
         WHERE id = 3 /* starting node */
       UNION ALL
         SELECT tree.id, tree.parent_id, tree.upline_id, tree.left , tree.rigth
         FROM tree, cte
         WHERE tree.upline_id = cte.id )
SELECT * 
FROM cte
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788502
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЯ спрашивал о том, сортированное дерево или нет.

nested set это судя по left , rigth
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788516
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ScareCrownested set это судя по left , rigthСудя по
YuriyBк примеру, нода 3 , пригласила новую точку, и ее нужно бросить , где то внизу, но в ветке ноды 3ни фига не nested set...
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788540
Фотография YuriyB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

я пока теоритически спрашиваю, таблицу данных можно поменять,
задачу я описал и нарисовал, а версию бд любую поставлю, это вообще не принципиально.

задача на уровне планирование.

постоение бинарного маркетинг плана
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788543
Фотография YuriyB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно даже несколько таблиц добавить.

задача добавить нового в нужное место . и быстро это местно найти.

желатеьльно что бы решение работало не только в бинаре, но и в тринаре
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788544
Фотография YuriyB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
возможно будет и миллион нод, сотни уровней, так что рекурсия будет долго работать
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788629
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuriyBтак что рекурсия будет долго работатьПрежде чем делать подобные заявления - хотя бы попробуйте. Генерация дерева на 1к уровней и 1кк узлов в CTE занимает не более минуты.
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39788734
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Деревья в базах данных можно хранить четырьмя основными методами: Adjacency List, Path Enumeration, Nested Set & Closure Table (НФ1-2-3).
Код: sql
1.
2.
3.
4.
5.
Design                  № of Tables     Query child     Query subtree   Modify tree     Referential integrity
Adjacency List          1               Easy            Hard            Easy            +
Path Enumeration        1               Easy            Easy            Hard            -
Nested Sets             1               Hard            Easy            Hard            -
Closure Table           2               Easy            Easy            Easy            +


из книжки "SQL Antipattern Strike Back" (49)
тут описание скорости
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39789192
Фотография YuriyB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
полудух,

спасибо. дерево не будет меняться, оно будет только рости, т е добавляться новые листья.
...
Рейтинг: 0 / 0
как найти все листья в бинарном дереве по заданной точке
    #39789285
Фотография полудух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда надо смотреть на "Modify tree" = easy
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
AL — когда у нас родитель хранится в колонке типа parent_id: '1'
PE — полный путь до элемента хранится в колонке типа path: '1.2.5' (? не годится, когда ПОДката может быть в нескольких НАДкатах ?). Хорош для "хлебных крошек" и сортировке по иерархии.
NS — пара колонок lft и rgt, хранящие диапазон всех вложенных элементов, например, корень дерева из 9 элементов будет иметь левое значение '1', а правое — '18'
    -- это дичь, когда при insert/delete нужно пересчитать ВСЁ дерево и ВСЕМ узлам по новой раздать parent_id/child_id.
CT - Closure Table (обычная нормализация, причём с FK. 48 слайд в "антипаттернах")
    -- она типа должна требовать O(N**2) строк в НФ, но на практике гораздо меньше.
    -- в НФ надо добавить колонку `depth` и ускорить поиск родителя. А можно попробовать подключить массивы с GIN (в мускуле нет) и пихать родичей туда. Чтобы не строчки плодить, а массив.

NS походу НЕ ГОДИТСЯ, когда ката может находиться в нескольких НАДкатах, потому что ID дублируется, а у NS кол-во right_key = кол-во_ID *2
они также не годятся и для комментариев/тикетов, потому что там в любых точках происходит коммент и всё остальное дерево надо пересчитывать. Если клиентов много, это будет 3.14здец.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / как найти все листья в бинарном дереве по заданной точке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]