我一直在思考的修改序树遍历算法,用于存储平表内的树木(如SQL)。
一个属性我不喜欢的标准方法是插入你必须触摸(平均)的节点N / 2节点(一切具有比插入点向左或向右更高)。
我见过的实现依赖于按顺序编号的值。 这没有留下任何更新。
这似乎是坏的并发性和缩放。 想象一下,你必须在包含用户组在一个大系统中的每个帐户世界扎根树,这是非常大的,到时候,你必须存储在不同的服务器树的子集。 所有节点的触摸半个到一个节点添加到树的底部是坏的。
这是我正在考虑这个想法。 基本上通过分割密钥空间,并在每个水平分割留有余地插入。
下面是用N 最大 = 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
该算法FFT都必须延长插入和删除过程递归重新编号为子树的左/右索引。 由于查询节点的直接子是复杂的,我觉得很有道理父ID也存储在表中。 然后,该算法可以选择子树(使用左> p.left &&右<p.right),然后用node.id和node.parent在列表中工作,细分指标。
这不仅是递增的所有索引,以腾出空间用于插入(或递减去除)更复杂,但它有可能影响少得多节点(只有插入/删除节点的父的decendenants)的潜力。
我的问题(S)基本上是:
有这种想法被正式或实施?
这是一样的区间套?