二叉堆:
二叉堆是具有以下属性的二叉树。
- 它是一个完整的二叉树,即所有级别都被完全填充,可能除了最后一级之外,最后一级尽可能保留所有键。二叉堆的这个特性使得它们适合存储在数组中。
- 二叉堆是Min Heap或Max Heap 。在最小二叉堆中,根处的键必须是二叉堆中所有键中的最小值。对于二叉树中的所有节点,相同的属性必须递归为真。 Max Binary Heap 类似于Min Heap 。
最小堆示例:
二项式堆:
二项式堆是二项式树的集合,其中每个二项式树都遵循最小堆属性,并且最多可以有一个任意度数的二项式树。
二项式堆的例子:
二叉堆和二叉堆之间的主要区别在于堆的结构。在二叉堆中,堆是一棵单树,是一棵完全二叉树。在二项式堆中,堆是一些较小的树(即一片树林)的集合,每棵树都是一棵二项式树。可以构建一个完整的二叉树来容纳任意数量的元素,但是在某个阶数N的二叉树中元素的数量总是2*N 。因此,需要一棵完整的二叉树来支持二叉堆,但我们可能需要多棵二叉树来支持二叉堆。
斐波那契堆:
与二项式堆一样,斐波那契堆是具有最小堆或最大堆属性的树的集合。在斐波那契堆中,树可以具有任何形状,甚至所有树都可以是单个节点(这与二项式堆不同,其中每棵树都必须是二项式树)。 Fibonacci Heap 维护一个指向最小值(即树的根)的指针。所有树根都使用循环双向链表连接,因此可以使用单个“min”指针访问所有树根。
斐波那契堆示例:
下表中提到了与二叉堆、二项堆和斐波那契堆相关的各种操作的时间复杂度差异。
Operation | Binary Heap | Binomial Heap | Fibonacci Heap |
---|---|---|---|
insert | O(log N) | O(log N) | O(1) |
find-min | O(1) | O(log N) | O(1) |
delete | O(log N) | O(log N) | O(log N) |
decrease-key | O(log N) | O(log N) | O(1) |
union | O(N) | O(log N) | O(1) |
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。