我目前正在学习不同的数据结构,我面临一个小问题。使用二进制搜索树实现的有序映射有什么用?我的意思是,什么时候这样做才好?一个实用的例子就太好了!
平衡BST有很多不同的用例,我不可能在这里列出所有用例,但这里有一些好的用例:
-
BST支持范围查询,您可以高效地询问两个值之间的所有条目。具体来说,在一个有n个条目的BST中,如果执行一个将返回k个元素的范围查询,则运行时为O(log n+k)。将其与使用哈希表进行比较,其中运行时为O(n)。如果您有兴趣对一组数据进行时间序列分析,并希望探索特定范围内的数据,则可以使用此方法。
-
BST支持继承者和继承者查询。给定BST,您可以在时间O(logn)中要求最小的元素大于某个值,或者要求最大的元素小于某个值。总的来说,这可以让你在BST中找到在时间O(logn)中最接近某个目标值的元素,如果你得到有噪声的数据并想将其映射到数据集中最接近的条目,这会很有用。将其与哈希表进行比较,其中这将花费时间O(n)。
-
BST在最坏情况下是有效的。许多常见类型的二进制搜索树,如红/黑树和AVL树,对其操作成本提供了最坏情况下的保证。与此形成对比的是哈希表,其中期望查询花费恒定的时间,但可能会因为糟糕的哈希函数或运气不好而降级。此外,哈希表不时需要重新哈希,这可能需要一段时间,但红/黑树和AVL树没有这样的情况。(有一些类型的平衡BST,如八字树和替罪羊树,在最坏的情况下效率并不高,但情况不同。)
-
BST可以方便地访问时间O(logn)中的最小值和最大值,即使插入和删除是混合的。哈希表无法支持这些操作。
-
BST支持有序迭代,因此,如果您有一个应用程序,希望按排序顺序查看数据,则可以使用BST"免费"获得数据。例如,如果您正在加载学生数据,并希望按排序顺序查看分数,则会出现这种情况。哈希表不支持这一点——你必须提取数据并对其进行排序,才能按排序顺序返回。
-
BST可以扩充。如果你参加了一门算法课程,你可能会学到一种名为树扩充的技术,在这种技术中,你可以在BST的每个节点中添加额外的信息,以比最初看起来更快的速度解决大量问题。例如,你可以扩充BST,使其能够立即读取中值元素或最接近的一对点,或者在底层数据改变时有效地解决许多算法问题。哈希表不支持这些操作。
-
BST支持高效的拆分和联接。红/黑树和展开树有一个有趣的特性,即给定两棵树,其中一棵树中的所有键都小于另一棵树的键,这些树可以在时间O(logn)内组合成一棵树——比访问树的所有元素快得多!您还可以将任何红/黑树或展开树拆分为两个较小的树,方法是在时间O(logn)中将树划分为"小于某个值的元素"或"大于某个值"。做这件事不是小事,但它是可能的。哈希表上相应操作的时间界限是O(n)。
如果我想其他什么,我会更新这个列表。希望这能有所帮助!