【问题标题】:How do I determine which kind of tree data structure to choose?如何确定选择哪种树数据结构?
【发布时间】:2010-12-19 05:30:50
【问题描述】:

好的,所以这一直是困扰我的事情。我知道的树数据结构是:

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

我如何确定哪种树最适合这项工作?显然堆被规范地用​​于形成优先级队列。但其余的似乎只是做同一件事的不同方式。有什么方法可以选择最适合这项工作的人吗?

【问题讨论】:

  • 你缺少了安德森树(也叫AA树),它相当于一棵2-3树,性能特征类似于红黑树,但更容易实现跨度>
  • 另一种树状数据结构是treaps
  • 还有确定性的跳过列表!

标签: data-structures tree


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    您通常可以在 Wikipedia 上找到任何类型数据结构的一般特征。 Introduction to Algorithms 也至少有一节(在某些情况下是一整章)关于您列出的大多数数据结构,因此它是另一个很好的参考。

    【讨论】:

    • 我打算最终翻阅那本书。我只是发现通常更容易在进入之前对我应该注意的内容有一个整体的了解。 :-)
    • @Jason:我做同样的事情,首先检查 Wikipedia 和 SO,然后再仔细阅读印刷材料。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      让我们一一挑选,好吗?

      • 不平衡二叉树

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

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

      • AVL 树

      它们很容易开发,但它们的性能通常会被其他平衡策略超越,因为平衡它们比较耗时。 Wikipedia claims 他们在查找密集型场景中表现更好,因为在最坏的情况下它们的高度略低。

      • 红黑树

      这些在大多数 C++ 的std::map 实现中使用,并且可能也在其他一些标准库中使用。然而,有good evidence 指出,由于现代 CPU 的缓存行为,它们实际上在每个场景中都比 B(+) 树差。从历史上看,当缓存不那么重要(或不那么好)时,它们在主内存中使用时超过了 B 树。

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

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

      我不知道区分它们的一般规则。

      • 尝试

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

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

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

      【讨论】:

        【解决方案5】:

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

        我想说的是,编写可能工作的最简单的代码(如果可能,请使用库提供的数据结构)。然后测量其性能问题(如果有)。

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

        【讨论】:

          猜你喜欢
          • 2012-05-15
          • 1970-01-01
          • 2013-11-12
          • 2016-05-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-07-25
          • 1970-01-01
          相关资源
          最近更新 更多