📜  在堆中插入和删除(1)

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

在堆中插入和删除

什么是堆?

堆(Heap)是一种基于树形结构的数据结构。它可以用来进行排序,也可以用来实现优先级队列等数据结构。

一般的堆分为两种:小根堆和大根堆。在小根堆中,父节点的值小于等于它的子节点的值;在大根堆中,父节点的值大于等于它的子节点的值。

插入元素

在堆中插入元素,需要遵循以下步骤:

  1. 将新元素插入堆的最后一个位置。
  2. 将新元素与它的父节点比较,如果它比父节点的值大(或者小,根据堆的类型),就交换它们的位置。
  3. 重复第二步,直到新元素被交换到它应该在的位置或者到达了堆的根节点。
def insert(heap, value):
    heap.append(value)
    index = len(heap) - 1
    parent = (index - 1) // 2
    while parent >= 0 and heap[index] > heap[parent]:
        heap[index], heap[parent] = heap[parent], heap[index]
        index = parent
        parent = (index - 1) // 2

这是一个在大根堆中插入元素的 Python 实现,我们用 heap 来表示堆,value 来表示要插入的元素。首先将元素插入到堆的最后一个位置,然后进行比较并交换位置,直到元素到达它应该在的位置。

删除元素

在堆中删除元素,需要遵循以下步骤:

  1. 将堆的最后一个元素移动到要删除的元素的位置。
  2. 比较要删除的元素和它的子节点,找到它们中的最大值(或最小值,根据堆的类型)。
  3. 如果最大值(或最小值)在子节点中,就将它与要删除的元素交换位置。
  4. 重复第二步和第三步,直到要删除的元素到达它应该在的位置或者到达了堆的叶子节点。
  5. 最后将要删除的元素从堆中取出。
def delete(heap):
    heap[0], heap[-1] = heap[-1], heap[0]
    value = heap.pop()
    index = 0
    child = index * 2 + 1
    while child < len(heap):
        if child + 1 < len(heap) and heap[child + 1] > heap[child]:
            child += 1
        if heap[child] > heap[index]:
            heap[child], heap[index] = heap[index], heap[child]
            index = child
            child = index * 2 + 1
        else:
            break
    return value

这是一个在大根堆中删除元素的 Python 实现,我们用 heap 来表示堆。首先将堆的最后一个元素移动到要删除的元素的位置,然后进行比较并交换位置,直到元素到达它应该在的位置或者到达了堆的叶子节点。最后将要删除的元素从堆中取出并返回。