python 中的 heappush 行为
heappush behavior in python
我有一个数组 arr = [1,2,1,3].
当我使用 heappush 函数将数组元素按原样推入堆中时,顺序与数组中的顺序完全相同:
arr = [1,2,1,3]
heap = []
for i in range(len(arr)):
heapq.heappush(heap, arr[i])
print(heap)
Result: [1, 2, 1, 3]
现在,如果我压入 arr 元素的 negative 值,堆将变为 sorted 因为它应该是。
arr = [1,2,1,3]
heap = []
for i in range(len(arr)):
heapq.heappush(heap, - arr[i]) <---- Here
print(heap)
Result: [-3, -2, -1, -1]
我想知道为什么 heappush 在将数组元素的负值添加到堆中时对数组元素进行排序,但在将正值推入堆中时却不执行任何操作。
这被称为 heap invariant
,您可以在 docs 中看到它的声明,以及它说的地方:
堆是二叉树,其中每个父节点的值都小于或等于它的任何子节点。此实现使用数组,其中 heap[k] <= heap[2*k+1]
和 heap[k] <= heap[2*k+2]
用于所有 k,从零开始计算元素。为了便于比较,不存在的元素被认为是无限的。堆的有趣 属性 是它的 最小元素始终是根,堆 [0].
请注意其中所说的最小元素始终是根,heap[0]
,这通过查看您的数据很明显。还要注意你的两个列表如何观察所有 k.
列出的 heap[k] <= heap[2*k+1]
和 heap[k] <= heap[2*k+2]
的属性
现在,如果我们查看您的列表,我们可以看到观察到的属性:
inf = float('inf')
arr = [1, 2, 1, 3]
for i in range(len(arr)):
x = arr[i]
try:
y = arr[2 * i + 1]
except IndexError:
y = inf
print('x <= y is {}'.format(x <= y))
x <= y is True
x <= y is True
x <= y is True
x <= y is True
如果使用负数组,同样适用。希望能帮助您解决问题。
我有一个数组 arr = [1,2,1,3].
当我使用 heappush 函数将数组元素按原样推入堆中时,顺序与数组中的顺序完全相同:
arr = [1,2,1,3]
heap = []
for i in range(len(arr)):
heapq.heappush(heap, arr[i])
print(heap)
Result: [1, 2, 1, 3]
现在,如果我压入 arr 元素的 negative 值,堆将变为 sorted 因为它应该是。
arr = [1,2,1,3]
heap = []
for i in range(len(arr)):
heapq.heappush(heap, - arr[i]) <---- Here
print(heap)
Result: [-3, -2, -1, -1]
我想知道为什么 heappush 在将数组元素的负值添加到堆中时对数组元素进行排序,但在将正值推入堆中时却不执行任何操作。
这被称为 heap invariant
,您可以在 docs 中看到它的声明,以及它说的地方:
堆是二叉树,其中每个父节点的值都小于或等于它的任何子节点。此实现使用数组,其中 heap[k] <= heap[2*k+1]
和 heap[k] <= heap[2*k+2]
用于所有 k,从零开始计算元素。为了便于比较,不存在的元素被认为是无限的。堆的有趣 属性 是它的 最小元素始终是根,堆 [0].
请注意其中所说的最小元素始终是根,heap[0]
,这通过查看您的数据很明显。还要注意你的两个列表如何观察所有 k.
heap[k] <= heap[2*k+1]
和 heap[k] <= heap[2*k+2]
的属性
现在,如果我们查看您的列表,我们可以看到观察到的属性:
inf = float('inf')
arr = [1, 2, 1, 3]
for i in range(len(arr)):
x = arr[i]
try:
y = arr[2 * i + 1]
except IndexError:
y = inf
print('x <= y is {}'.format(x <= y))
x <= y is True
x <= y is True
x <= y is True
x <= y is True
如果使用负数组,同样适用。希望能帮助您解决问题。