代码之家  ›  专栏  ›  技术社区  ›  Amir Jalilifard

python中的heappush行为

  •  0
  • Amir Jalilifard  · 技术社区  · 6 年前

    arr=[1,2,1,3] .

    乱堆 函数将数组元素推入堆中,其顺序与数组中的顺序完全相同:

    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 = [1,2,1,3]
    heap = []
    for i in range(len(arr)):
         heapq.heappush(heap,  - arr[i])    <---- Here
    print(heap)
    
    Result: [-3, -2, -1, -1]
    

    我想知道为什么 当数组元素的负值被添加到堆中时,对其进行排序,但当正值被推入堆中时,它不会执行任何操作。

    0 回复  |  直到 6 年前
        1
  •  4
  •   gold_cy    6 年前

    heap invariant 你可以看到在 docs 还有上面写着:

    heap[k] <= heap[2*k+1] heap[k] <= heap[2*k+2] 对于所有k,从零开始计算元素。为了比较,不存在的元素被认为是无限的。堆的有趣特性是 .

    注意它说最小的元素总是根, heap[0] ,通过查看您的数据可以明显看出。还要注意两个列表是如何观察所列属性的 堆[k]<=堆[2*k+1] 堆[k]<=堆[2*k+2] 对所有k。

    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
    

    如果使用负数组,也同样适用。希望这能帮你把事情弄清楚。