Я думал о модифицированном алгоритме обхода дерева предзаказа для хранения деревьев в плоской таблице (такой как SQL).
В стандартном подходе мне не нравится одно свойство: вставлять
должны касаться (в среднем) N / 2 узлов (все, что слева или справа выше точки вставки).
Реализации, которые я видел, основаны на последовательно пронумерованных значениях. Это не оставляет места для обновлений.
Это кажется плохим для параллелизма и масштабирования. Представьте, что у вас есть дерево с корнями в мире, содержащее группы пользователей для каждой учетной записи в большой системе, оно чрезвычайно велико, и вы должны хранить подмножества дерева на разных серверах. Дотрагиваться до половины всех узлов, чтобы добавить узел к нижней части дерева, плохо.
Вот идея, которую я рассматривал. В основном оставьте место для вставок, разделив пространство клавиш и разделившись на каждом уровне.
Вот пример с N max = 64 (обычно это MAX_INT вашей БД)
0:64
________|________
/ \
1:31 32:63
/ \ / \
2:14 15-30 33:47 48:62
Здесь узел добавляется к левой половине дерева.
0:64
________|________
/ \
1:31 32:63
/ | \ / \
2:11 11:20 21:30 33:47 48:62
Алгоритм должен быть расширен для процесса вставки и удаления, чтобы рекурсивно перенумеровать в левый / правый индексы для поддерева. Поскольку запрос непосредственных потомков узла является сложным, я думаю, что имеет смысл также хранить родительский идентификатор в таблице. Затем алгоритм может выбрать поддерево (используя left> p.left && right
Это сложнее, чем просто увеличивать все индексы, чтобы освободить место для вставки (или уменьшить для удаления), но он может повлиять на гораздо меньшее количество узлов (только на потомков родительского элемента вставленного / удаленного узла).
Мои вопросы в основном:
Эта идея была формализована или реализована?
Это то же самое, что и вложенные интервалы?