返回

数据结构之堆:一个不可思议的数据结构

后端

堆的概念

堆是一种完全二叉树,它符合以下两个性质:

  1. 最小堆性质: 每个节点的值都大于或等于其子节点的值。
  2. 最大堆性质: 每个节点的值都小于或等于其子节点的值。

堆的操作

堆支持以下基本操作:

  • 插入: 将一个新元素插入堆中,保持堆的性质。
  • 删除: 删除堆中的根节点,并用堆中最后一个元素替换它,保持堆的性质。
  • 获取最小/最大值: 返回堆中最小/最大值的元素。

堆的应用

堆在计算机科学中有着广泛的应用,包括:

  • 排序: 堆排序是一种基于堆的快速排序算法。
  • 优先队列: 堆可以实现优先队列,其中优先级最高(最小/最大)的元素始终在堆顶。
  • 抖音热榜: 抖音热榜使用堆来存储点赞数最多的视频,方便用户快速找到最热门的内容。

示例代码

以下是用 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

结语

堆是一个功能强大的数据结构,在各种应用中发挥着关键作用。它的树形结构和堆的性质使它能够高效地执行排序和优先队列操作。理解堆的概念和操作对于任何软件工程师来说都是至关重要的。