使用最大堆与平衡 BST 实现优先级队列
Implementing priority queue using max heap vs balanced BST
平衡BST和最大堆都在O(logn)
中执行插入和删除。但是,在最大堆中找到最大值是 O(1)
,但在平衡 BST 中是 O(logn)
。
如果我们删除最大堆中的最大值,则需要 O(logn)
,因为这是一个删除操作。
平衡BST中,删除最大元素=求最大值+删除;它等于 logn + logn 减少到 O(logn)
。所以即使删除平衡 BST 中的最大值也是 O(logn)
.
我读过最大堆的一个这样的应用是优先队列,它的主要目的是删除每个出列操作的最大值。如果删除最大元素是O(logn)
对于最大堆和平衡BST,我有以下问题
优先级队列中最大堆的目的是什么,只是因为它易于实现而不是使用完全可搜索的平衡 BST?
既然没有计算平衡因子,那么最大堆也能称为不平衡二叉树?
每个平衡的 BST 都可以用作优先级队列,也可以在 O(logn)
中搜索,但是最大堆搜索 O(n)
正确吗?
所有时间复杂度都是针对最坏情况计算的。非常感谢任何帮助。
What is the purpose of a max heap in the priority queue just because it is easy to implement rather than using full searchable balanced BST?
没有。最大堆更适合,因为它在 O(1) 时间内被仔细地检测到 return 下一个(尊重优先级)元素。这就是您想要的最简单的优先级队列。
Since there is no balancing factor calculation, the max heap can be called an unbalanced binary tree?
没有。也有平衡。长话短说,平衡堆是通过上移或下移操作(交换乱序的元素)来完成的。
Every balanced BST can be used as a priority queue and which is also searchable in O(logn) however max heap search is O(n) correct?
是啊!以及可以使用链表或数组。就 O 符号而言,它只会更昂贵,而且在实践中会慢得多。
What is the purpose of a max heap in the priority queue just because it is easy to implement rather than using full searchable balanced BST?
堆的一些优点是:
给定一个未排序的输入数组,heap can still be built in O(n) time, while a BST needs O(nlogn) time.
如果初始输入是一个数组,那么same数组可以作为堆,这意味着它不需要额外的内存。尽管可以想出使用数组中的数据就地创建 BST 的方法,但这会很奇怪(对于原始类型)并且会产生更多的处理开销。 BST 通常是从头开始创建的,在创建节点时将数据复制到节点中。
有趣的事实:排序后的数组也是堆,因此如果知道输入已排序,则无需执行任何操作来构建堆。
堆可以存储为数组而不需要存储交叉引用,而BST通常由具有左右引用的节点组成。这至少有两个后果:
- BST 使用的内存大约是堆的 3 倍。
- 虽然堆和 BST 的几个操作具有相同的时间复杂度,但适应 BST 的开销要大得多,因此在 BST 情况下,花在这些操作上的实际时间是一个(常数)因子。
Since there is no balancing factor calculation, the max heap can be called an unbalanced binary tree?
堆实际上是一个complete binary tree,所以它总是尽可能地平衡:叶子总是位于最后一层或最后一层。自平衡 BST(如 AVL、红-黑……)无法击败那种高水平的平衡,在这种情况下,您通常会在三个级别甚至更多级别出现叶子。
Every balanced BST can be used as a priority queue and which is also searchable in O(logn) however max heap search is O(n) correct?
是的,这是真的。因此,如果应用程序需要搜索功能,那么 BST 更胜一筹。
平衡BST和最大堆都在O(logn)
中执行插入和删除。但是,在最大堆中找到最大值是 O(1)
,但在平衡 BST 中是 O(logn)
。
如果我们删除最大堆中的最大值,则需要 O(logn)
,因为这是一个删除操作。
平衡BST中,删除最大元素=求最大值+删除;它等于 logn + logn 减少到 O(logn)
。所以即使删除平衡 BST 中的最大值也是 O(logn)
.
我读过最大堆的一个这样的应用是优先队列,它的主要目的是删除每个出列操作的最大值。如果删除最大元素是O(logn)
对于最大堆和平衡BST,我有以下问题
优先级队列中最大堆的目的是什么,只是因为它易于实现而不是使用完全可搜索的平衡 BST?
既然没有计算平衡因子,那么最大堆也能称为不平衡二叉树?
每个平衡的 BST 都可以用作优先级队列,也可以在
O(logn)
中搜索,但是最大堆搜索O(n)
正确吗?
所有时间复杂度都是针对最坏情况计算的。非常感谢任何帮助。
What is the purpose of a max heap in the priority queue just because it is easy to implement rather than using full searchable balanced BST?
没有。最大堆更适合,因为它在 O(1) 时间内被仔细地检测到 return 下一个(尊重优先级)元素。这就是您想要的最简单的优先级队列。
Since there is no balancing factor calculation, the max heap can be called an unbalanced binary tree?
没有。也有平衡。长话短说,平衡堆是通过上移或下移操作(交换乱序的元素)来完成的。
Every balanced BST can be used as a priority queue and which is also searchable in O(logn) however max heap search is O(n) correct?
是啊!以及可以使用链表或数组。就 O 符号而言,它只会更昂贵,而且在实践中会慢得多。
What is the purpose of a max heap in the priority queue just because it is easy to implement rather than using full searchable balanced BST?
堆的一些优点是:
给定一个未排序的输入数组,heap can still be built in O(n) time, while a BST needs O(nlogn) time.
如果初始输入是一个数组,那么same数组可以作为堆,这意味着它不需要额外的内存。尽管可以想出使用数组中的数据就地创建 BST 的方法,但这会很奇怪(对于原始类型)并且会产生更多的处理开销。 BST 通常是从头开始创建的,在创建节点时将数据复制到节点中。
有趣的事实:排序后的数组也是堆,因此如果知道输入已排序,则无需执行任何操作来构建堆。
堆可以存储为数组而不需要存储交叉引用,而BST通常由具有左右引用的节点组成。这至少有两个后果:
- BST 使用的内存大约是堆的 3 倍。
- 虽然堆和 BST 的几个操作具有相同的时间复杂度,但适应 BST 的开销要大得多,因此在 BST 情况下,花在这些操作上的实际时间是一个(常数)因子。
Since there is no balancing factor calculation, the max heap can be called an unbalanced binary tree?
堆实际上是一个complete binary tree,所以它总是尽可能地平衡:叶子总是位于最后一层或最后一层。自平衡 BST(如 AVL、红-黑……)无法击败那种高水平的平衡,在这种情况下,您通常会在三个级别甚至更多级别出现叶子。
Every balanced BST can be used as a priority queue and which is also searchable in O(logn) however max heap search is O(n) correct?
是的,这是真的。因此,如果应用程序需要搜索功能,那么 BST 更胜一筹。