如何确定选择哪种树数据结构?

时间:2009-11-22 14:38:03

标签: data-structures tree

好的,所以这总是困扰着我。我所知道的树数据结构是:

  • 不平衡二叉树
  • AVL树
  • 红黑树
  • 2-3棵树
  • B树
  • B * - 树
  • 尝试次数

如何确定哪种树是最适合工作的工具?显然,堆被规范地用​​于形成优先级队列。但其余的人似乎只是做同样事情的不同方式。有没有办法选择最适合这份工作的人?

5 个答案:

答案 0 :(得分:26)

我们一个接一个地拿走它们,好吗?

  
      
  • 不平衡二叉树
  •   

对于搜索任务,永远不要。基本上,它们的性能特征将是完全不可预测的,并且平衡树的开销不会太大,以至于使不平衡树成为可行的替代方案。

除此之外,不平衡的二叉树当然还有其他用途,但不是搜索树。

  
      
  • AVL树
  •   

它们易于开发,但其性能通常被其他平衡策略所超越,因为平衡它们是相对耗时的。 Wikipedia claims他们在查找密集型场景中的表现更好,因为在最坏的情况下,他们的身高会略微降低。

  
      
  • 红黑树
  •   

这些在大多数C ++'std::map实现中使用,也可能在其他一些标准库中使用。但是,由于现代CPU的缓存行为,它们实际上比每个场景中的B(+)树更糟糕good evidence。从历史上看,当缓存不那么重要(或者说好)时,它们在主存中使用时会超过B树。

  
      
  • 2-3棵树
  •   
  • B树
  •   
  • B * - 树
  •   

这些需要对所有树进行最仔细的考虑,因为使用的不同常量基本上是“神奇的”常量,它们以奇怪的,有时是不可预测的方式与底层硬件架构相关。例如,每个级别的子节点的最佳数量可以取决于内存页面或缓存行的大小。

我知道没有好的,一般的规则来区分它们。

  
      
  • 尝试次数
  •   

完全不同。尝试也是搜索树,但用于语料库中子串的文本检索。 trie是未压缩的前缀树(即从根节点到叶节点的路径对应于给定字符串的所有前缀的树)。

尝试应该与后缀树后缀数组 q-gram索引进行比较和抵消,而不是与其他搜索树,因为他们搜索的数据是不同的:而不是语料库中的离散词,后面的索引结构允许因子搜索

  
      
  •   

正如您已经说过的,它们根本不是搜索树。

答案 1 :(得分:5)

与任何其他数据结构一样,您必须了解每种树类型的特征(搜索,插入和删除操作的复杂性),以及您为其选择工具的工作要求。对于您最常执行的操作类型,性能最佳的树通常是最适合工作的工具。

您通常可以在维基百科上找到任何类型数据结构的一般特征。 Introduction to Algorithms在您列出的大多数数据结构中至少还有一个部分(在某些情况下是整章),因此这是另一个很好的参考。

答案 2 :(得分:4)

类似的问题:When to choose RB tree, B-Tree or AVL tree?

我会说,写一些可能有效的最简单的代码(尽可能利用库提供的数据结构)。然后测量其性能问题,如果有的话。

如果您的表现需求非常极端,请阅读Konrad Rudolph的精彩回答。 :)

答案 3 :(得分:0)

每个都有不同的插入,删除和检索复杂性,所有这些都有O log(n)访问时间。

答案 4 :(得分:0)

每棵树都有特定的特征,使它们以某种方式有用。您应该将这些特征与您的需求进行比较。