什么是堆(Heap)?
堆(Heap)是一种特殊的完全二叉树,它可以是最大堆或最小堆。在最大堆中,每个父节点的值都大于或等于其子节点的值;而在最小堆中,每个父节点的值都小于或等于其子节点的值。堆用于优先队列、动态数组、图的最小生成树等场景。
堆的特性
1. 完全二叉树:堆是一种完全二叉树,这意味着除了最底层外,其他每一层都被完全填满,最底层节点按从左到右的顺序排列。
2. 最大堆/最小堆:堆可以是最大堆或最小堆。最大堆中的父节点值大于或等于子节点值;最小堆中的父节点值小于或等于子节点值。
3. 顺序存储:堆以顺序存储的存储在数组中。在数组中,对于任意节点i,其左子节点为2i,右子节点为2i+1。
堆的用途
1. 优先队列:堆可以用于实现优先队列。在最大堆中,具有最高优先级的元素总是位于堆的顶部,而在最小堆中,具有最低优先级的元素总是位于堆的顶部。
2. 动态数组:堆可以用于动态数组,实现插入、删除、查找最大/最小元素等操作。
3. 图的最小生成树:在图的最小生成树算法中,堆可以用于选择最小边。
4. 贪心算法:堆常用于贪心算法,如活动选择、背包等。
堆的插入与删除操作
1. 插入操作:
(1)将新元素插入到堆的一个位置。
(2)将新元素与其父节点进行比较,新元素大于父节点(在最大堆中),则交换它们的位置;否则,保持不变。
(3)重复步骤2,直到新元素满足堆的性质。
2. 删除操作:
(1)将堆顶元素(最大或最小值)与堆的一个元素进行交换。
(2)删除交换后的一个元素,即原堆顶元素。
(3)将新堆顶元素与其子节点进行比较,新堆顶元素大于(或小于)子节点(在最大堆中),则交换它们的位置;否则,保持不变。
(4)重复步骤3,直到新堆顶元素满足堆的性质。
堆的优缺点
优点:
1. 插入、删除、查找最大/最小元素等操作的时间复杂度均为O(logn),n为堆中元素的个数。
2. 堆在内存中占用空间较小,因为它以顺序存储的存储在数组中。
缺点:
1. 堆不支持随机访问,只能通过顺序访问元素。
2. 在某些情况下,堆的插入和删除操作需要移动多个元素,导致性能下降。
堆是一种特殊的完全二叉树,具有最大堆和最小堆两种形式。在计算机专业面试中,了解堆的基本概念、特性、用途、操作和优缺点是非常重要的。通过本文的介绍,相信您已经对堆有了更深入的了解。祝您面试顺利!
还没有评论呢,快来抢沙发~