【python】python 中关于堆的基本结构

未知: heap 到什么用途 ????

 

原文参考 :https://blog.csdn.net/jamfiy/article/details/88185512 

heap

# test in jupyter
from heapq import *
from random import shuffle
data=list(range(10))
shuffle(data)
print(*data)
heap=[]
for n in data:
    heappush(heap,n)
heap
# 这里 data 已经是 随机的顺序了, heappush 则是按照 下边说的这套规则放置新的 数字元素, i/2

  heap 规则:     元素的排列顺序并不像看起来那么随意。它们虽然不是严格排序的,但必须保证一点:位置i处的元素总是大于位置i // 2处的元素(反过来说就是小于位置2 * i和2 * i + 1处的元素)。这是底层堆算法的基础,称为堆特征(heap property)。

个人做了一些测试。首先 同样是 0--9 ,10个数字,shuffle之后的结果,将会有很多种, 应该是 10*9*8 -----*2*1,种, 但是 , 如果要符合heap特性, 个人设想,因为每次shuffle结果不同,但是 还是可以产生很多种‘heap规则’的排列,我做了两组的情况

data 和 heap: 
6 3 7 8 1 4 9 5 2 0
Out[29]:
[0, 1, 4, 3, 2, 7, 9, 8, 5, 6]

而 data1 和 heap1:

4 0 2 6 3 1 7 5 9 8
Out[33]:
[0, 3, 1, 5, 4, 2, 7, 6, 9, 8]

heappush 

    heappush(heap,n)

heapify

  一个list 必须是不符合 heap原则的,才能使用heapify 处理,处理之后,符合了 heap原则,就无法再对 list 使用这个原则了

heappop

   heappop (heap) : 从左到右 依次 弹出数字

 

heapreplace

    heapreplace (heap,n)

  用n 来代替原来的最小数字元素

nlargest 和 nsmalllest

需要 import heaq

>>> heapq.nlargest(10,heap)

[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
>>> heapq.nlargest(3,heap)
[9, 8, 7]

可见就是 类似 排序, 取出最大和最小的n个数字

 

posted @ 2020-10-10 10:29  allen514519  阅读(157)  评论(0)    收藏  举报