我目前正在学习不同的数据结构,而且我面临一些小问题。使用二叉搜索树实现有序地图的用途是什么?我的意思是,什么时候这样做好?一个实际的例子会很棒!
答案 0 :(得分:2)
平衡BST有不同用例的 ton ,我不可能在这里列出所有这些用例,但这里有一些很好的用例:
BST支持范围查询,您可以在其中有效地请求两个值之间的所有条目。具体来说,在具有n个条目的BST中,如果执行范围查询,其中将返回k个元素,则运行时为O(log n + k)。比较一下,比方说,使用哈希表,运行时将是O(n)。如果您有兴趣对一组数据进行时间序列分析并希望探索某些范围内的数据,则可以使用此方法。
BST支持后继和前置查询。给定BST,您可以要求最大元素大于某个值,或者要求最大元素小于某个值O(log n)。总而言之,这使您可以在时间O(log n)中找到最接近某个目标值的BST中的元素,如果您收到噪声数据并希望将其映射到数据集中最近的条目,这可能很有用。将此与哈希表进行比较,这需要时间O(n)。
BST 最差情况。许多常见类型的二叉搜索树,如红/黑树和AVL树,可以最大限度地保证其运营成本。将其与哈希表进行对比,其中查询期望以获取恒定时间,但是可以使用错误的哈希函数或仅仅由于运气不好而降级。此外,哈希表不时会重新散列,这可能需要一段时间,但红/黑树和AVL树没有这样的情况。 (有一些类型的平衡BST,如展开树和替罪羊树,这些都不是最糟糕的情况,但这是一个不同的故事。)
BST可以在时间O(log n)中轻松访问最小值和最大值,即使插入和删除是混合的。哈希表不支持这些操作。
BST支持有序迭代,因此,如果您有一个应用程序要按排序顺序查看数据,则可以使用BST“免费”获取该数据。例如,如果您正在加载学生数据并希望按排序顺序查看分数,则会出现这种情况。哈希表不支持这一点 - 您必须提取数据并对其进行排序以按排序顺序将其恢复。
BST可以扩充。如果你学习算法课程,你可能会学习一种叫做树增强的技术,你可以在BST的每个节点中添加额外的信息来解决大量的问题,比最初看起来要快得多。例如,您可以扩充BST以立即读取中值元素或最接近的点对,或者在更改基础数据时有效地解决许多算法问题。哈希表不支持这些操作。
BST支持高效拆分和加入。红色/黑色树和展开树具有有趣的特性,给定两棵树,其中一个中的所有键都小于另一个中的键,树可以在时间O(log n)中组合成一棵树 - 很多比访问树的所有元素更快!您还可以通过在时间O(log n)中将树划分为“小于某个值的元素”或“多于某个值的元素”,将任何红/黑树或展开树拆分为两个较小的树。这样做并非易事,但这是可能的。哈希表上相应操作的时间范围是O(n)。
如果我想到其他任何事情,我会更新此列表。希望这有帮助!