Python堆常用操作

首先需要一个 import heapq的引用包

import heapq  #引入heapq包
class Test:
    def test(self):
        #创建堆 这里为了后面添加 所以创建一个空堆
        minheap=[]
        heapq.heapify(minheap)#将列表转换为堆 如果这里初始minheap不为空 则会自动生成最小堆
        #添加堆内元素
        heapq.heappush(minheap,10)
        heapq.heappush(minheap,8)
        heapq.heappush(minheap,9)
        heapq.heappush(minheap,2)
        heapq.heappush(minheap,11)
        heapq.heappush(minheap,1)
        print(minheap) #输出结果为[1,2,9,10,8,11]
        #查找堆顶元素
        print(minheap[0]) #1
        #删除元素/弹出堆顶元素 边输出边删除
        heapq.heappop(minheap)
        #长度
        len(minheap)
        #遍历
        while len(minheap)!=0:
            print(heap.heappop(minheap))
        #将元素压入堆中,并弹出最小元素 调用的heapq.heappushpop() 相当于先调用heappush再调用heappop() 但是比它们分别调用的效率要高
        b=heapq.heappushpop(minheap,0)
        print(b) #0
        print(minheap) #[1,2,9,10,8,11]
        #弹出并返回heap中最小的一项 同时压入新的item 调用heapreplace() 相当于先调用heappop()再调用heappush() 效率同样比分别调用要高
        c=heapq.heapreplace(minheap,0)
        print(c) #1
        print(minheap) #[0,2,9,10,8,11]
        '''将多个已排序的输入合并为一个已排序的输出 调用heapq.merge(iterables, key=None, reverse=False)   
        其中iterables为多个已排序的输入,key为None时,直接比较元素的大小,reverse=True逆序排列'''
        d = [0, 1, 3, 5]
        e = [2, 6, 8, 9]
        print(list(heapq.merge(d,e)))#[0, 1, 2, 3, 5, 6, 8, 9]
        #返回前n个最大元素组成的列表 注意是列表!!
        g=heapq.nlargest(3,minheap)
        print(g) #[11,10,9]
        #返回前n个最小元素组成的列表 注意是列表!!
        f=heapq.nsmallest(3,minheap)
        print(f) #[0,2,8]
        #其中heapq.nlargest()和heapq.nsmallest()的参数都为(n,iterable,key=None)原理和上述的 heapq.merge()的

PS:Python默认构建最小堆 而没有方法来直接建立最大堆 一般来说都是通过使用取反的方式来进行最大堆的构建的

posted @ 2021-05-02 15:32  乖张❤  阅读(146)  评论(0)    收藏  举报