我一直在思考修改的先序遍历树遍历算法,用于在平面表(如SQL)中存储树。
标准方法让我不喜欢其中一个特性:插入节点时,您必须平均触及N/2个节点(所有左侧或右侧高于插入点的内容)。
我看到的实现依赖于连续编号的值。这对于更新留下了没有余地。
这对并发和扩展来说似乎很糟糕。想象一下,您在存储整个世界的用户组的树,该用户组包含大型系统中每个帐户的用户组,它非常庞大,以至于您必须在不同的服务器上存储树的子集。接触一半的所有节点以将节点添加到树的底部是不好的。
这就是我正在考虑的想法。基本上,通过分区键空间并在每个级别上进行划分,为插入留出空间。
以下是一个示例,其中Nmax=64(通常为DB的MAX_INT)。
在这里,一个节点被添加到树的左半部分。
算法必须扩展到插入和删除过程,以递归地重新编号子树的左/右索引。由于查询节点的直接子节点很复杂,我认为在表中也存储父ID是有意义的。然后,算法可以选择子树(使用left>p.left&&right<p.right),然后使用node.id和node.parent来处理列表,细分索引。
这比仅使所有索引增加以腾出插入的空间(或减少删除)更为复杂,但它有可能影响更少的节点(仅插入/删除节点的父级的后代)。
我的问题基本上是:
1. 是否已经形式化或实现了这个想法? 2. 这是否与嵌套区间相同?
标准方法让我不喜欢其中一个特性:插入节点时,您必须平均触及N/2个节点(所有左侧或右侧高于插入点的内容)。
我看到的实现依赖于连续编号的值。这对于更新留下了没有余地。
这对并发和扩展来说似乎很糟糕。想象一下,您在存储整个世界的用户组的树,该用户组包含大型系统中每个帐户的用户组,它非常庞大,以至于您必须在不同的服务器上存储树的子集。接触一半的所有节点以将节点添加到树的底部是不好的。
这就是我正在考虑的想法。基本上,通过分区键空间并在每个级别上进行划分,为插入留出空间。
以下是一个示例,其中Nmax=64(通常为DB的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来处理列表,细分索引。
这比仅使所有索引增加以腾出插入的空间(或减少删除)更为复杂,但它有可能影响更少的节点(仅插入/删除节点的父级的后代)。
我的问题基本上是:
1. 是否已经形式化或实现了这个想法? 2. 这是否与嵌套区间相同?