在计算机科学中,堆(Heap)是一种基于树形结构的数据结构,常被用来实现优先队列。堆分为最大堆和最小堆,其底层实现依赖于数组。本文将详细介绍堆的概念、底层原理、大小堆的代码实现方法以及常见的应用场景。
1. 概念介绍
堆是一种特殊的树形数据结构,其中每个节点的值都必须满足特定的条件。在最大堆中,父节点的值始终大于或等于其子节点的值;而在最小堆中,父节点的值始终小于或等于其子节点的值。堆通常用来实现优先队列,其中元素按照优先级进行排序。
2. 底层原理
堆通常使用数组来实现。具体来说,对于一个具有n个元素的堆:
- 父节点的索引为
i
,则其左子节点的索引为2i+1
,右子节点的索引为2i+2
。 - 子节点的索引为
j
,则其父节点的索引为(j-1)/2
。
利用这种索引关系,可以在数组中轻松表示堆的结构,并且可以在常数时间内找到父节点和子节点。
3. 最大堆与最小堆的代码实现方法
最大堆实现方法
class MaxHeap:
def __init__(self):
self.heap = []
def insert(self, val):
self.heap.append(val)
self._heapify_up(len(self.heap) - 1)
def _heapify_up(self, index):
while index > 0:
parent = (index - 1) // 2
if self.heap[parent] < self.heap[index]:
self.heap[parent], self.heap[index]