Data structures 使用二进制搜索树的具体示例?

Data structures 使用二进制搜索树的具体示例?,data-structures,tree,hashtable,binary-search-tree,Data Structures,Tree,Hashtable,Binary Search Tree,我了解二进制搜索树是如何实现的,但我不确定使用它比大多数编程语言在其标准库中内置的哈希表有什么好处 有人能提供用二叉搜索树解决现实问题的例子吗?一个需要二叉树的例子是计算机图形学中的二叉空间分区 由于算法需要保留二叉树中节点之间的关系,因此需要二叉树。还有许多其他算法,其中树的结构很重要,因此哈希表不是合适的结构 使用二叉树而不是哈希表的另一个很好的原因是,当您无法轻松为数据项生成有效的哈希,但可以生成比较函数时 通常,对于简单的数据存储和检索,哈希表更为优化,但实现起来更为复杂 最容易被忽视

我了解二进制搜索树是如何实现的,但我不确定使用它比大多数编程语言在其标准库中内置的哈希表有什么好处


有人能提供用二叉搜索树解决现实问题的例子吗?

一个需要二叉树的例子是计算机图形学中的二叉空间分区

由于算法需要保留二叉树中节点之间的关系,因此需要二叉树。还有许多其他算法,其中树的结构很重要,因此哈希表不是合适的结构

使用二叉树而不是哈希表的另一个很好的原因是,当您无法轻松为数据项生成有效的哈希,但可以生成比较函数时


通常,对于简单的数据存储和检索,哈希表更为优化,但实现起来更为复杂

最容易被忽视的一点是,许多文件系统使用二叉树来管理目录列表。它们很少使用普通的二叉树,而是使用一些变体,如B-树。这是因为树的磁盘存储问题对于实现的细节非常重要。他们使用这种结构的原因是为了效率和速度。这让他们可以在一个目录中支持数千个文件。文件创建和删除时间的比较突出了文件系统这方面的效率


二叉树也用于许多渲染3D对象的游戏。同样,原因是速度。事实上,速度非常重要,一些游戏引擎(如地震引擎)实际上在地图构建过程中预先生成并优化了二叉树。

需要注意的一点是,二叉搜索树是节省空间的。例如,你有10个整数要存储,你有一个从0到99映射的哈希函数,然后你需要一个100个整数的数组。
如果使用二元搜索树,则只能分配10个元素所需的内存。

二元搜索树在理论上比哈希表有一些优势:

  • 它们按排序顺序存储元素。这意味着,如果您希望以一种可以轻松按排序顺序访问值的方式存储容器,那么BST可能是比哈希表更好的选择。例如,如果您希望存储一组学生,然后按字母顺序打印所有学生,那么BST是比哈希表更好的选择

  • 它们有效地支持范围查询。因为BST是按排序顺序存储的,所以很容易回答二进制搜索树中“范围[x,y]中的值是什么?”这样的问题。为此,在树中查找大于x的最小元素和小于y的最大元素,然后在它们之间遍历树中的元素。这两个查询都在平衡树中以O(lgn)时间运行,因此此操作的总运行时间为O(lgn+k),其中k是匹配查询的元素数

  • 它们有效地支持最近邻查询。哈希表是专门设计的,因此即使稍有不同,也会产生截然不同的哈希代码。这为散列值提供了所需的分散度,以避免在一个点中聚集太多的元素。然而,这也意味着您需要对哈希表进行线性扫描,以找到可能“接近”您要查找的元素。使用BST,您可以高效地找到您想要的任何值的前置值和后续值,即使它不在树中

  • 它们可以有更好的最坏情况保证。大多数哈希表实现都有某种退化情况,在这种情况下,操作在最坏情况下可以退化为O(n)。线性探测哈希表或链式哈希表在元素集不好的情况下,每次查找需要O(n)个时间,或者在重新哈希时需要O(n)个时间。插入某些类型的平衡BST,如红/黑树、AVL树或AA树,通常是最坏情况O(lg n)

  • 如果您愿意将BST推广到更复杂的树结构,那么在许多应用程序中,树可以比哈希表更有效地解决问题。这里有几个例子:

  • kd树允许您存储多维数据,同时支持多维空间中的快速范围查询,以及高效的最近邻查找。您可以将它们用于分类(惰性学习算法)或计算几何

  • 链接/切割树可用于解决最大流量问题,比大多数传统算法更有效。好的push/relabel算法使用这一点来加速其实现

  • 不相交集林可用于尽可能渐近有效地维护元素的分区(每次更新摊销α(n),其中α(n)是阿克曼逆函数)。它们用于许多快速最小生成树算法,以及一些最大匹配算法

  • 二进制堆可以有效地实现优先级队列。更复杂的树可以用来建立二项堆斐波那契堆,这在理论计算机科学中非常重要

  • 决策树可用于机器学习中的分类,并作为理论计算机科学中的一个模型来证明各种算法运行时的界限

  • 三元搜索树是基于稍加修改的BST的尝试的替代方法。它们允许非常快速的查找和插入