📜  数据结构|堆|问题1(1)

📅  最后修改于: 2023-12-03 15:40:01.046000             🧑  作者: Mango

堆-问题1

概念

堆是一种特殊的树形数据结构,通常用于动态数据集合中元素的选择。

堆分为最大堆和最小堆两种形式。在最大堆中,父节点的键值总是大于或等于任何一个子节点的键值;在最小堆中,父节点的键值总是小于或等于任何一个子节点的键值。

堆的另一个性质是堆总是一颗完全二叉树。

实现

在实现堆时通常会使用一个数组来存储元素。在数组中,如果一个元素的索引是i,则它的父节点的索引为(i - 1) / 2,它的左子节点的索引为2i + 1,它的右子节点的索引为2i + 2。

我们可以用这个性质来快速访问堆中的元素,同时保持堆的结构特性。

问题1

现在我们需要实现一个最大堆,并且支持以下操作:

  1. 插入一个元素
  2. 获取堆顶元素
  3. 删除堆顶元素

请你完成这个最大堆的实现,并编写测试代码来验证其正确性。

class MaxHeap:
    def __init__(self):
        self.heap = []

    def parent(self, i):
        return (i - 1) // 2

    def left_child(self, i):
        return 2 * i + 1

    def right_child(self, i):
        return 2 * i + 2

    def swap(self, i, j):
        self.heap[i], self.heap[j] = self.heap[j], self.heap[i]

    def insert(self, value):
        self.heap.append(value)
        i = len(self.heap) - 1
        while i != 0 and self.heap[self.parent(i)] < self.heap[i]:
            self.swap(i, self.parent(i))
            i = self.parent(i)

    def max_heapify(self, i):
        l = self.left_child(i)
        r = self.right_child(i)
        largest = i
        if l < len(self.heap) and self.heap[largest] < self.heap[l]:
            largest = l
        if r < len(self.heap) and self.heap[largest] < self.heap[r]:
            largest = r
        if largest != i:
            self.swap(i, largest)
            self.max_heapify(largest)

    def extract_max(self):
        max_value = self.heap[0]
        self.heap[0] = self.heap.pop()
        self.max_heapify(0)
        return max_value

heap = MaxHeap()
heap.insert(10)
heap.insert(5)
heap.insert(15)
assert heap.extract_max() == 15
assert heap.extract_max() == 10