【问题标题】:Improving time complexity in a sorted left-child-right-sibling tree提高排序的左子右兄弟树的时间复杂度
【发布时间】:2020-11-16 17:14:57
【问题描述】:

据我了解,在一个已经排序的左子右兄弟树中,如果我想给它添加一个孩子,让我们在“E”之后说“F”,我将不得不遍历每个兄弟姐妹的时间复杂度为 O(n)。这是最优化的吗?有没有办法提高效率?如果有,怎么做?

    A
   /
  B->C->D->E 

【问题讨论】:

  • 您可以用其他东西(例如平衡二叉树)替换兄弟列表,但这会使节点变大。

标签: c data-structures tree


【解决方案1】:

如果我想在其中添加一个孩子,让我们在“E”之后说“F”,我将不得不遍历每个兄弟姐妹

对于您描述的特定操作,在您描述的特定树上:是的。

这使得它的时间复杂度为 O(n)。

不,它没有。该分析从单个案例中做出了不恰当的概括。

对于大于 2 的某些 k,通常将左子右兄弟树用作 k-ary 树的二叉树表示。情况下,性能特征与对应的k-ary树没有区别。

您似乎忽略了一个关键点,即在任何给定的左子右兄弟树中,任何节点的兄弟节点的数量都将受到一个常数的限制。因此,遍历一个节点的兄弟节点的成本不随节点总数成比例。相反,它是 O(k) = O(1)。

还要考虑插入产生的树可能是什么。如果您的示例对应于 5-(或更多)-ary 树,那么它可能是

    A
   /
  B->C->D->E->F 

,但如果它对应于四叉树,那么这是不可能的。相反,结果可能是以下任何一种:

    A
   /
  B->C->D->F 
          /
         E

    A
   /
  C->D->E->F 
 /
B


    A
   /
  B->C->E->F 
       /
      D

或许多其他人。如果你进一步构建它,你会发现只要树是近似平衡的,不,搜索树的键或插入位置不会花费 O(n),而是 O(log n),只是就像一个直接的 k-ary(包括二叉树)树。

这是最优化的吗?有没有办法提高效率?如果有,怎么做?

产生更多平衡树的插入策略将导致比产生不平衡树的插入策略更好的最坏情况搜索效率。总体上最坏的可能情况确实是无分支树,相当于链表,但问题中没有什么与产生更好搜索结果的策略不一致。

【讨论】:

    【解决方案2】:

    如果您只想在最后一个元素'E' 之后添加元素,那么您可以通过保持指向存储在A 中的元素E 的指针并在添加F 后更新指针来使其保持不变存储在A

    如果你想添加任何元素并且想要仍然保持元素排序,那么你可以创建一个Binary Tree,并达到O(log2 N)的时间复杂度。您可以通过制作平衡树来进一步改进该数据结构( AVL Tree)。 AVLs 比二叉树具有更好的平均复杂性和最坏情况复杂性,因为它们避免了某些子树可能变得太长,甚至在极端情况下,将列表作为子树。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 2013-02-13
      • 1970-01-01
      相关资源
      最近更新 更多