[PY3]——heap模块 和 堆排序

heapify( )

heapify()函数用于将一个序列转化为初始化堆

nums=[16,7,3,20,17,8,-1]
print('nums:',nums)
show_tree(nums)

nums: [16, 7, 3, 20, 17, 8, -1]

                 16                 
        7                 3         
    20       17       8        -1   
------------------------------------

heapq.heapify(nums)
print('nums:',nums)
show_tree(nums)

nums: [-1, 7, 3, 20, 17, 8, 16]

                 -1                 
        7                 3         
    20       17       8        16   
------------------------------------

 

heappush( )

heappush()是实现将元素插入到堆的操作
heappush()操作前一定要先将序列初始化成堆!heappush是对于"堆"的操作!不然是没有意义

nums=[16,7,3,20,17,8,-1]
print(nums)
show_tree(nums)

       [16, 7, 3, 20, 17, 8, -1]

                   16                 
          7                 3         
      20       17       8        -1   
  ------------------------------------

heapq.heapify(nums)
print('初始化成堆:',nums) show_tree(nums) 初始化成堆: [-1, 7, 3, 20, 17, 8, 16] -1 7 3 20 17 8 16 ------------------------------------
for i in random.sample(range(1,8),2):
    print("本次push:",i)
    heapq.heappush(nums,i)
    print(nums)
    show_tree(nums)
    
    本次push: 5
    [-1, 5, 3, 7, 17, 8, 16, 20]

                     -1                 
            5                 3         
        7        17       8        16   
     20 
    ------------------------------------

    本次push: 7
    [-1, 5, 3, 7, 17, 8, 16, 20, 7]

                     -1                 
            5                 3         
        7        17       8        16   
     20  7  
    ------------------------------------

 

heappop( )

heappop()是实现将元素删除出堆的操作
同样的操作前一定要先将序列初始化成堆,否则也没什么意义

nums=[16,7,3,20,17,8,-1]
print(nums)
show_tree(nums)

          [16, 7, 3, 20, 17, 8, -1]

                       16                 
              7                 3         
          20       17       8        -1   
      ------------------------------------

heapq.heapify(nums)
print('初始化成堆:',nums)
show_tree(nums)

        初始化成堆: [-1, 7, 3, 20, 17, 8, 16]

                         -1                 
                7                 3         
            20       17       8        16   
        ------------------------------------
for i in range(0,2):
    print("本次pop:",heapq.heappop(nums))
    print(nums)
    show_tree(nums)

        本次pop: -1
        [3, 7, 8, 20, 17, 16]

                         3                  
                7                 8         
            20       17       16   
        ------------------------------------

        本次pop: 3
        [7, 16, 8, 20, 17]

                         7                  
                16                8         
            20       17   
        ------------------------------------

 

nlargest( )/nsmallest( )

sorted(iterable, key=key, reverse=True)[:n]

  • nlargest(n,iterable) 求序列iterable中的TopN | nsmallest(n,iterable) 求序列iterable中的BtmN
import heapq
nums=[16,7,3,20,17,8,-1]
print(heapq.nlargest(3,nums))
print(heapq.nsmallest(3,nums))

[20, 17, 16]
[-1, 3, 7]
  • nlargest(n, iterable, key=lambda) | nsmallest(n, iterable, key=lambda) key接受关键字参数,用于更复杂的数据结构中
def print_price(dirt):
    for i in dirt:
        for x,y in i.items():
            if x=='price':
                print(x,y)

portfolio = [
    {'name': 'IBM', 'shares': 100, 'price': 91.1},
    {'name': 'AAPL', 'shares': 50, 'price': 543.22},
    {'name': 'FB', 'shares': 200, 'price': 21.09},
    {'name': 'HPQ', 'shares': 35, 'price': 31.75},
    {'name': 'YHOO', 'shares': 45, 'price': 16.35},
    {'name': 'ACME', 'shares': 75, 'price': 115.65}
]

cheap=heapq.nsmallest(3,portfolio,key=lambda x:x['price'])
expensive=heapq.nlargest(3,portfolio,key=lambda y:y['price'])
print_price(cheap)
print_price(expensive)

price 16.35
price 21.09
price 31.75

price 543.22
price 115.65
price 91.1

 

关于heap和heap sort

对于上面的nums=[16,7,3,20,17,8,-1]序列,图解了:

构造堆的操作(点击查看)

push堆的操作(点击查看)

pop堆的操作(点击查看)

 

参考文章

详解Python中heapq模块的用法(包括show_tree())

详解堆排序

浅谈算法和数据结构: 五 优先级队列与堆排序

 

转载于:https://www.cnblogs.com/snsdzjlz320/p/7145540.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值