二叉堆而不是二叉搜索树
Posted
技术标签:
【中文标题】二叉堆而不是二叉搜索树【英文标题】:binary heap instead of a binary search tree 【发布时间】:2019-02-21 12:46:23 【问题描述】:在哪些情况下您将使用?
我对每个结构都有基本的了解。如果可能的话,我想听听您的意见。
【问题讨论】:
【参考方案1】:在优先级队列的情况下,使用二叉堆而不是二叉搜索树会很有帮助。优先级队列需要某些功能,例如访问优先级元素、插入元素和删除最高优先级元素。堆可以分别在 O(1)、O(log n) 和 O(log n) 中做到这一点。但是,某些类型的二叉搜索树也可以做到这一点(请参阅:自平衡搜索树)。除此之外,优先级队列也更容易用二叉堆实现,不需要额外的指针空间,构建它们需要 O(n) 时间,而自平衡二叉搜索树需要 O(n log n) 时间。
二叉堆比二叉搜索树更有用的另一种情况是,如果您需要随机顺序删除并可以访问堆对象的索引。
总体而言,二进制堆在使用更少空间(通过常数因子)方面派上用场,并且可以用单个数组实现而无需担心指针。但是,归根结底,您的选择实际上取决于您尝试实现的任何应用程序。
【讨论】:
【参考方案2】:当您需要查找数据集中的最小或最大元素时,二进制堆非常有用。二叉堆总是在根节点中具有最小或最大元素,因此可以在恒定 (O(1)) 时间内检索它。二叉堆可用于最大化某些算法的效率,例如 prim 的最小生成树算法和 dijkstra 的最短路径算法。这些算法都可以使用二进制堆来快速找到运行它们的图中可用的最小边。
二叉搜索树的优点是可以轻松地按顺序访问元素,但是管理二叉搜索树比二叉堆需要更多的开销。因此,如果根据向其中添加元素的方式和内容,也可以低效地制作二叉搜索树。如果树不平衡,那么使用二叉搜索树的许多效率优势就会消失。使用红黑树或 abl 树可以解决此问题,但代价是维持平衡的开销。
简而言之,当人们只需要在数据集中找到最大或最小元素时,二叉堆会更好,因为它易于访问且管理成本更低。二叉搜索树包含元素的特定顺序,但它们需要更多的管理。
【讨论】:
以上是关于二叉堆而不是二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章