使用最大堆与平衡 BST

问题描述

平衡 BST 和最大堆都在 O(logn) 中执行插入和删除。但是,在最大堆中找到最大值是 O(1),但这是平衡 BST 中的 O(logn)

如果我们删除最大堆中的最大值,则需要 O(logn),因为这是一个删除操作。

在平衡BST中,删除max元素=求最大值+删除;它等于 logn + logn 减少到 O(logn)。所以即使删除平衡 BST 中的最大值也是 O(logn)

我读过一个这样的最大堆应用程序是一个优先队列,它的主要目的是删除每个出队操作的最大值。如果删除最大元素对于最大堆和平衡 BST 都是 O(logn)我有以下问题

  • 在优先级队列中使用最大堆的目的是因为它易于实现而不是使用完全可搜索的平衡 BST?

  • 既然没有平衡因子计算,那么最大堆可以称为不平衡二叉树吗?

  • 每个平衡的 BST 都可以用作优先级队列,并且也可以在 O(logn)搜索,但是最大堆搜索O(n) 正确吗?

所有时间复杂度都是针对最坏情况计算的。非常感谢任何帮助。

解决方法

优先队列中最大堆的目的是什么,仅仅因为它易于实现而不是使用完全可搜索的平衡 BST?

没有。最大堆更适合,因为它被仔细检测以在 O(1) 时间内尽快返回下一个(尊重优先级)元素。这就是您想要的最简单的优先级队列。

既然没有平衡因子计算,那么最大堆可以称为不平衡二叉树吗?

没有。也有一个平衡。长话短说,平衡堆是通过上移或下移操作(交换无序元素)来完成的。

每个平衡的 BST 都可以用作优先级队列,并且也可以在 O(logn) 中搜索,但是最大堆搜索是 O(n) 正确吗?

是的!也可以使用链表或数组。就 O 符号而言,它只会更昂贵,而且在实践中要慢得多。

,

优先队列中最大堆的目的是什么,仅仅因为它易于实现而不是使用完全可搜索的平衡 BST?

堆的一些优点是:

  • 给定一个未排序的输入数组,一个 heap can still be built in O(n) time,而一个 BST needs O(nlogn) time

  • 如果初始输入是一个数组,该相同数组可以用作堆,这意味着它不需要额外的内存。尽管人们可以想到使用数组中就地数据创建 BST 的方法,但它会很奇怪(对于原始类型)并且会产生更多的处理开销。 BST 通常从头开始创建,在节点创建时将数据复制到节点中。

    有趣的事实:排序后的数组也是堆,因此如果知道输入已排序,则无需执行任何操作来构建堆。

  • 堆可以存储为数组而不需要存储交叉引用,而 BST 通常由具有左右引用的节点组成。这至少有两个后果:

    • 用于 BST 的内存大约是堆的 3 倍。
    • 尽管对于堆和 BST 而言,多个操作的时间复杂度相同,但适应 BST 的开销要大得多,因此在 BST 情况下,花在这些操作上的实际时间是更大的(常数)因子。
    • 立>

既然没有平衡因子计算,那么最大堆可以称为不平衡二叉树吗?

堆实际上是一个 complete binary tree,所以它总是尽可能地平衡:叶子总是位于最后一层或最后一层。自平衡 BST(如 AVL、红黑等)无法击败那种高水平的平衡,在这种情况下,叶子通常出现在三个甚至更多的水平。

每个平衡的 BST 都可以用作优先级队列,并且也可以在 O(logn) 中搜索,但是最大堆搜索是 O(n) 正确吗?

是的,这是真的。因此,如果应用程序需要搜索功能,那么 BST 更好。