关于平衡树分析

时间:2011-08-31 05:29:44

标签: algorithm

我正在读一本关于树木的书。这是文本片段。

  

实现平衡树有很多通用算法。   大多数都比标准二进制搜索复杂得多   树,平均需要更长的时间。但是,它们确实提供了   防止令人尴尬的简单案件。

     

更新的方法是放弃平衡条件并允许树   任意深刻,但每次操作后,重组   适用的规则往往使未来的运营更有效率。这些   数据结构的类型通常被归类为自我调整。   在二叉搜索树的情况下,我们不能再保证了   O(log n)绑定在任何单个操作上,但可以显示任何序列   在最坏的情况下,m次操作占用总时间O(m log n)。

有关上述文字小组的问题

  1. 作者如何在第一段中得出结论作者是什么意思是令人尴尬的简单案例如何平衡树的一般算法提供 防止这种情况发生?

  2. 作者的意思是“在最后一段m操作的任何序列需要总时间O(mlogn)我们如何得出这个结论,请求解释 示例

  3. 谢谢!

4 个答案:

答案 0 :(得分:2)

  1. 对于二叉搜索树的典型,简单实现,仅插入序列1, 2, 3, ..., n将生成具有n个级别的树。 (插入每个元素一直遍历树的右侧,然后在那一侧添加一个新元素,导致最大的不平衡树。)我相信这就是他们所说的“令人尴尬的简单”。

    < / LI>
  2. 他们在谈论splay trees(与AVL或红/黑树相对)。 AVL和红/黑树保证每次插入/删除/查找操作的O(log n)最坏情况,但代价是复杂的代码和一个稍大的常数因子。对于每个操作,Splay树不保证O(log n),但对于任何长操作序列,它们确实保证每次操作平均的O(log n)。所以从长远来看,它们的表现与更复杂的树一样,但实现更简单,常数因子更小。

答案 1 :(得分:1)

如果您从排序列表开始并且没有进行任何重新平衡,那么您将获得完全不平衡的n级深度树的最坏情况。但是输入已经被排序了,你应该能够在O(n)时间内把它放在一个合理的顺序中(选择中间元素作为根,递归到左半部分和右半部分为根的孩子)。

答案 2 :(得分:0)

1。)我相信作者的意思是一些节点,基本上看起来像一个悬空列表。使用自我调整和旋转的树(查看AVL Trees),您可以在树上打击“查找”或“删除”,例如高度为O(n)。

2.)如果树是自调整的,其高度将为O(logn)。由于我们在树上执行m次操作,我们可以假设,因为big-O是最坏情况下的运行时间,所以操作的对象可能位于底部,因此对高度为O(logn)的树进行m次操作(摊销运行)由于可能再次发生旋转,因此将是O(mlogn)。

答案 3 :(得分:0)

  1. 简单二进制搜索树的最坏情况是,当它变得如此不平衡时,每个节点只有一个子节点。在这种情况下,具有N个节点的树将具有高度N,并且树上的操作可能具有O(N)复杂度。平衡二叉搜索树通过在树操作之后以某种方式重新平衡树来防止发生这种情况。由于这些重新平衡操作,我认为可以说所有平衡树算法都比简单的不平衡树更复杂。

  2. 他们谈论的是摊销的复杂性。基本上他们说虽然如果我们进行一系列O(log(N))操作,单个操作的复杂性并不总是M,但每个操作平均会达到O(log(N))复杂度,以便M操作的总计为O(Mlog(N)).

  3. 希望这有帮助。