我正在阅读有关Java编程的大量内容。在我的教科书中,我发现了堆的这个定义:堆是一个完整的二叉树,具有以下属性:1)根中的值是树中的最小项; 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)
在计算机科学中,堆是一种专门的基于树的数据结构 满足堆属性:如果A是B的父节点,那么 节点A的密钥是根据节点B的密钥排序的 在堆中应用相同的排序。堆可以分类 进一步作为“最大堆”或“最小堆”。在最大堆中, 父节点的密钥总是大于或等于 子节点和最高键位于根节点中。在最小堆中, 父节点的键小于或等于子节点的键 最低密钥位于根节点中。堆是至关重要的几个 高效的图算法,如Dijkstra的算法,以及 排序算法heapsort。堆的常见实现是 二进制堆,其中树是完整的二叉树(见图)。
有两种类型的堆:
Min Heap :父节点总是比孩子小。
最大堆:父节点总是比孩子大。