改善改良序树遍历算法的可扩展性(Improving scalability of the modif

2019-07-29 07:54发布

我一直在思考的修改序树遍历算法,用于存储平表内的树木(如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)基本上是:

  1. 有这种想法被正式或实施?

  2. 这是一样的区间套?

Answer 1:

我听说过的人面前这样做,出于同样的原因,是的。

请注意,您在做一对夫妇的算法小的优点通过这样输

  • 通常情况下,你可以告诉一个节点的后代的数量((右 - 左+ 1)2区)。 这可以偶尔是有用的,如果如你在显示一个TreeView,其中应包括孩子的数量计数的树进一步向下找到
  • 从上面的流动,可以很容易地选择出的所有叶节点 - WHERE(右左= + 1)。

这些都是相当轻微的优势,也有可能对你有用,无论如何,尽管对于一些使用模式,它们显然得心应手。

这就是说,它听起来像物化路径可能对你更有用,如上建议。



Answer 2:

我觉得你还是考虑一下存储树以不同的方式更好。 如果你的树是广泛,但不是非常深(这似乎可能对你的建议的情况下),你可以祖先的完整列表存储多达针对每个节点的根。 这样,修改的节点不需要触摸比其它节点的任何节点被修改。



Answer 3:

您可以将表分为两个:第一个是(节点ID,节点值),第二(节点ID,子ID),它存储了树的所有边缘。 插入和删除,然后变成O(树的深度)(你必须导航到该元素,解决什么是它下面)。

你提出的解决方案看起来像一个B树 。 如果你能估计在树的节点总数,那么你可以事先选择树的深度。



文章来源: Improving scalability of the modified preorder tree traversal algorithm