堆的正确定义是什么

时间:2015-12-15 14:00:14

标签: data-structures heap

我正在阅读有关Java编程的大量内容。在我的教科书中,我发现了堆的这个定义:堆是一个完整的二叉树,具有以下属性:1)根中的值是树中的最小项; 2)每个子树都是一堆

但是当我观看有关堆的视频时,我发现堆的完全不同的定义是:在一堆中,父键更大然后是孩子们。

现在我感到困惑,因为这两个定义并不相符。 哪个定义是正确的?

谢谢!

2 个答案:

答案 0 :(得分:2)

这两个定义都是正确的。

两种类型Heap

Min Heap:哪个父节点始终为smaller而不是其子节点。

Max Heap:其中,父节点始终为larger,而不是其子节点。

父级的smaller/larger值比其子级称为堆属性。树的每个节点都满足Heap Property

来自给定数组的constructing the Heap的复杂性为O(n)。此操作称为 Heapify

给定一个堆,从堆中添加/删除节点/元素。操作的复杂性为O(log(n))

使用堆数据结构(堆排序)对任何数组进行排序的复杂性为O(n.log(n))。基本上,您从Min Heap中提取顶部(根)元素。此操作重复n次,因此复杂度为O(n.log(n))

答案 1 :(得分:0)

Quoting wikipedia here

  

在计算机科学中,堆是一种专门的基于树的数据结构   满足堆属性:如果A是B的父节点,那么   节点A的密钥是根据节点B的密钥排序的   在堆中应用相同的排序。堆可以分类   进一步作为“最大堆”或“最小堆”。在最大堆中,   父节点的密钥总是大于或等于   子节点和最高键位于根节点中。在最小堆中,   父节点的键小于或等于子节点的键   最低密钥位于根节点中。堆是至关重要的几个   高效的图算法,如Dijkstra的算法,以及   排序算法heapsort。堆的常见实现是   二进制堆,其中树是完整的二叉树(见图)。

有两种类型的堆:

Min Heap :父节点总是比孩子小。

最大堆:父节点总是比孩子大。