返回
数据结构之堆:一个不可思议的数据结构
后端
2024-01-10 23:00:41
堆的概念
堆是一种完全二叉树,它符合以下两个性质:
- 最小堆性质: 每个节点的值都大于或等于其子节点的值。
- 最大堆性质: 每个节点的值都小于或等于其子节点的值。
堆的操作
堆支持以下基本操作:
- 插入: 将一个新元素插入堆中,保持堆的性质。
- 删除: 删除堆中的根节点,并用堆中最后一个元素替换它,保持堆的性质。
- 获取最小/最大值: 返回堆中最小/最大值的元素。
堆的应用
堆在计算机科学中有着广泛的应用,包括:
- 排序: 堆排序是一种基于堆的快速排序算法。
- 优先队列: 堆可以实现优先队列,其中优先级最高(最小/最大)的元素始终在堆顶。
- 抖音热榜: 抖音热榜使用堆来存储点赞数最多的视频,方便用户快速找到最热门的内容。
示例代码
以下是用 Python 实现的最小堆:
class MinHeap:
def __init__(self):
self.heap = []
def insert(self, value):
# 将新元素插入堆的末尾
self.heap.append(value)
# 调整堆以满足最小堆性质
self._heapify_up(len(self.heap) - 1)
def delete(self):
# 将根节点与最后一个元素交换
self.heap[0], self.heap[-1] = self.heap[-1], self.heap[0]
# 弹出最后一个元素(根节点)
popped = self.heap.pop()
# 调整堆以满足最小堆性质
self._heapify_down(0)
return popped
def _heapify_up(self, index):
# 如果当前元素的父元素比当前元素大,则交换它们
parent = (index - 1) // 2
while index > 0 and self.heap[index] < self.heap[parent]:
self.heap[index], self.heap[parent] = self.heap[parent], self.heap[index]
index = parent
parent = (index - 1) // 2
def _heapify_down(self, index):
# 如果当前元素的子元素比当前元素小,则交换它们
left = 2 * index + 1
right = 2 * index + 2
while left < len(self.heap):
smaller_child = left
if right < len(self.heap) and self.heap[right] < self.heap[left]:
smaller_child = right
if self.heap[index] <= self.heap[smaller_child]:
break
self.heap[index], self.heap[smaller_child] = self.heap[smaller_child], self.heap[index]
index = smaller_child
left = 2 * index + 1
right = 2 * index + 2
结语
堆是一个功能强大的数据结构,在各种应用中发挥着关键作用。它的树形结构和堆的性质使它能够高效地执行排序和优先队列操作。理解堆的概念和操作对于任何软件工程师来说都是至关重要的。