在什么情况下使用min-heap比使用二叉搜索树更有效?在二元搜索树中找到最小值的时间是否等于在最小堆中找到最小值 - O(1)?
是真的吗?答案 0 :(得分:3)
这几乎就像比较咖啡杯和考拉熊。堆和二叉搜索树旨在执行非常不同的功能。堆是优先级队列抽象数据类型的实现。在基本级别,优先级队列(以及堆)只是放置东西的包,当你到达获取项目时,你总是获得最小(最小堆)或最大(最大堆)袋中的物品。
您可以获得幻想并让您的堆能够删除任意项目,或者更改堆中项目的优先级,但这些是更高级的功能,并且不属于传统的范围堆数据结构的定义。
二叉搜索树是一种截然不同的野兽。它是你放东西的包,你可以快速到达按键抓取任何项目,或者你可以按顺序(或逆序)列出所有项目。
您可以使用二叉搜索树来实现优先级队列,这意味着您原则上可以用二叉树替换堆。二进制搜索树不会像堆一样执行,但它可以完成工作。
但反过来并非如此。您无法使用堆来替换二叉搜索树。
所以哪个更好的问题实际上是你想做什么的问题?
如果您想要一组有序的项目,您可以从中快速找到任何项目,或者您可以按顺序遍历,那么您需要一个二叉搜索树。
如果你想要一个优先级队列抽象数据类型的实现:一个包,当你要求它时,它会快速给你最小(或最大,取决于你如何定义它)的项目,那么你想要使用一个堆
答案 1 :(得分:1)
两者有不同的用途,不可互换。
堆是一种结构,可以保证给定节点的值低于或等于(对于最小堆;对于最大堆大于或等于),而不是下面任何节点的值。这允许在 O(1)中获得最小(或最大)值。
二叉搜索树是一种保持所有节点有序的结构。这允许检索 O(h)中的任何值( h 是树的高度, h = log 2 ( n)如果树是平衡的, n 节点数。)