我一直在考虑改进的前序树遍历算法,用于将树存储在平面表中(例如 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
插入和删除过程必须扩展该算法,以递归地重新编号到子树的左/右索引。由于查询节点的直接子节点很复杂,我认为将父 ID 也存储在表中是有意义的。然后算法可以选择子树(使用 left > p.left && right < p.right),然后使用 node.id 和 node.parent 遍历列表,细分索引。
这比仅仅增加所有索引为插入腾出空间(或减少删除)更复杂,但它有可能影响更少的节点(仅插入/删除节点的父节点的后代)。
我的问题基本上是:
这个想法是否已经正式化或实施了?
这与嵌套间隔相同吗?