C 改进排序左子右兄弟树的时间复杂度

C 改进排序左子右兄弟树的时间复杂度,c,data-structures,tree,C,Data Structures,Tree,根据我的理解,在一个已经排序的左子右兄弟树中,如果我想在“E”之后添加一个子树,比如说“F”,我必须遍历每个兄弟树,使其时间复杂度为O(n)。这是最理想的吗?有没有办法提高效率?如果是,怎么做 A / B->C->D->E 如果只想在最后一个元素'E'之后添加元素,则可以将指向A中存储的元素E的指针保持不变,并在添加F之后更新存储在A中的指针 如果您想要添加任何元素,并且仍然想要保持元素的排序,那么您可以创建一个二叉树,并实现O(log2n)时间复杂度。通

根据我的理解,在一个已经排序的左子右兄弟树中,如果我想在“E”之后添加一个子树,比如说“F”,我必须遍历每个兄弟树,使其时间复杂度为O(n)。这是最理想的吗?有没有办法提高效率?如果是,怎么做

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

如果只想在最后一个元素
'E'
之后添加元素,则可以将指向
A
中存储的元素
E
的指针保持不变,并在添加
F
之后更新存储在
A
中的指针


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

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

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

如果我想给它添加一个子元素,让我们在“E”之后加上“F”,我必须遍历每个兄弟元素

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

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

不,没有。这种分析从一个案例中得出了不恰当的概括

对于大于2的某些k,左子右同级树通常用作k元树的二叉树表示。在这种情况下,性能特征与相应的k元树的性能特征没有区别

您似乎忽略的一个关键点是,在任何给定的左子右同级树中,任何节点的同级数都将以常量为界。因此,遍历节点的兄弟节点的成本不随节点总数的增加而增加。相反,它是O(k)=O(1)

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

    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(logn),就像直接的k元(包括二进制)树一样

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

    A
   /
  B->C->D->E 
与产生不平衡树的插入策略相比,产生更平衡树的插入策略将导致更好的最坏情况搜索效率。总的来说,最糟糕的情况确实是一棵无分支树,它相当于一个链表,但问题中没有任何东西与产生更好搜索结果的策略不一致

如果我想给它添加一个子元素,让我们在“E”之后加上“F”,我必须遍历每个兄弟元素

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

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

不,没有。这种分析从一个案例中得出了不恰当的概括

对于大于2的某些k,左子右同级树通常用作k元树的二叉树表示。在这种情况下,性能特征与相应的k元树的性能特征没有区别

您似乎忽略的一个关键点是,在任何给定的左子右同级树中,任何节点的同级数都将以常量为界。因此,遍历节点的兄弟节点的成本不随节点总数的增加而增加。相反,它是O(k)=O(1)

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

    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(logn),就像直接的k元(包括二进制)树一样

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

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

与产生不平衡树的插入策略相比,产生更平衡树的插入策略将导致更好的最坏情况搜索效率。总的来说,最糟糕的情况确实是无分支树,它相当于一个链表,但问题中的任何内容都与产生更好搜索结果的策略不一致。

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