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

Data structures 如何确定要选择哪种树数据结构?,data-structures,tree,Data Structures,Tree,好吧,这一直困扰着我。我知道的树数据结构有: 非平衡二叉树 AVL树 红黑树 2-3棵树 B-树 B*-树 尝试 堆 我如何确定什么样的树是工作的最佳工具?显然,堆通常用于形成优先级队列。但其余的似乎只是做同一件事的不同方式。有没有办法为作业选择最好的一个呢?每一个都有不同的插入、删除和检索复杂度,都有O(n)个日志访问时间。与任何其他数据结构一样,您必须知道每种类型树的特征(搜索、插入和删除操作的复杂度),以及你选择工具的工作要求。对于您最常执行的操作类型,具有最佳性能的树通常是该作业的最

好吧,这一直困扰着我。我知道的树数据结构有:

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

我如何确定什么样的树是工作的最佳工具?显然,堆通常用于形成优先级队列。但其余的似乎只是做同一件事的不同方式。有没有办法为作业选择最好的一个呢?

每一个都有不同的插入、删除和检索复杂度,都有O(n)个日志访问时间。

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


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

每棵树都有特定的特性,使它们在某种程度上有用。你应该把这些特点与你的需要进行比较。

让我们一个一个地把它们挑选出来,好吗

  • 非平衡二叉树
对于搜索任务,从不。基本上,它们的性能特征是完全不可预测的,平衡树的开销不会太大,以至于不平衡树成为可行的替代方案

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

  • AVL树
它们很容易开发,但它们的性能通常被其他平衡策略所超越,因为平衡它们相对而言需要大量时间。在查找密集型场景中,它们的性能更好,因为在最坏的情况下,它们的高度略低

  • 红黑树

这些在C++的“代码> STD::MAP< /COD>实现中使用,也可能在其他几个标准库中使用。然而,由于现代CPU的缓存行为,它们实际上在任何情况下都比B(+)树差。从历史上看,当缓存没有那么重要(或那么好)时,它们在主内存中使用时超过了B树

  • 2-3棵树
  • B-树
  • B*-树
这些需要对所有树进行最仔细的考虑,因为使用的不同常量基本上都是“神奇的”常量,它们与底层硬件架构有着奇怪的、有时不可预测的关系。例如,每个级别的最佳子节点数可能取决于内存页或缓存线的大小

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

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

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

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

类似的问题:

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


如果您的性能需求真的很极端,请阅读康拉德·鲁道夫(Konrad Rudolph)的精彩回答:

您缺少了Andersson树(也称为AA树),它相当于2-3树,具有类似于红黑树的性能特征,但更容易实现另一种类似树的数据结构是treapsAnd deterministic skip list!我打算最终翻阅那本书。我只是发现在开始之前,通常更容易对我应该注意的事情有一个全面的了解。:-)@杰森:我也这么做,先查维基百科,然后再翻阅印刷品。