MinHeap删除理解

MinHeap Delete Understanding

我很难理解教授给我的关于堆的其中一个问题的解决方案。

Give pseudocode for the routine Min-Heap-Delete(A, k). Assume that key k is at location l of the heap and that 1 ≤ l ≤ n.

我的解决办法是

Exchange A[k] with A[A.size() - 1]

A.size() = A.size() - 1

Min-heapify(A,k)

不过,我的解法和第一部分教授的解法有些不同。

Exchange A[k] with A[A.heap_size()]

A.heap_size() = A.heap_size() - 1

最小堆化(A,k)

为什么我们要使用 A.size() 而不是 A.size() - 1? A.size() 不会过度索引表示堆的数组,因为堆从索引 1 开始吗?

在这种情况下,A.size() 会给我们 10。但是,A[10] 不存在并且会导致错误。所以,为什么不是A[10-1]获取堆树的最后一个节点呢?

因为教授使用从 1 开始的计数而不是从 0 开始的计数。注意 1 ≤ l ≤ n 条件。你可能错过了索引是 A.heap_size - 堆大小而不是数组大小,所以最后一个元素将被称为 A[9]

对于堆来说,这是比较常见的做法,也很方便,因为child/parent索引关系看起来很简单:

childs = parent * 2 and parent * 2 + 1
parent = child / 2

请注意,图片中的数组实际上是基于 zeo 的,具有未使用的零条目