美文网首页
python 中的堆

python 中的堆

作者: April63 | 来源:发表于2018-06-20 20:43 被阅读0次

heapq
import heapq
heap = [] #创建了一个空堆
heappush(heap,item) #往堆中插入一条新的值
item = heappop(heap) #从堆中弹出最小值
item = heap[0] #查看堆中最小值,不弹出
heapify(x) #以线性时间讲一个列表转化为堆
item = heapreplace(heap,item) #弹出并返回最小值,然后将heapqreplace方法中item的值插入到堆中,堆的整体结构不会发生改变。这里需要考虑到的情况就是如果弹出的值大于item的时候我们可能就需要添加条件来满足function的要求

if item > heap[0]
    item = heapreplace(heap, item)

heappushpop() #顾名思义,将值插入到堆中同时弹出堆中的最小值。
merge(*iterables) #合并多个堆然后输出

>>>list(merge([1,3,5,7],[0,2,4,8],[5,10,15,20],[],[25]))
[0, 1, 2, 3, 4, 5, 5, 7, 8, 10, 15, 20, 25]

nlargest(n , iterbale, key=None)
从堆中找出做大的N个数,key的作用和sorted( )方法里面的key类似,用列表元素的某个属性和函数作为关键字。

>>>a = [0, 1, 2, 3, 4, 5, 5, 7, 8, 10, 15, 20, 25]
>>>heapq.nlargest(5,a)
[25, 20, 15, 10, 8]

这样就返回了列表中前五个最大的数。

>>>b = [('a',1),('b',2),('c',3),('d',4),('e',5)]
>>>heapq.nlargest(1,b,key=lambda x:x[1])
[('e', 5)]

加入key之后的使用方法。

nsmallest(n, iterable, key=None) #找到堆中最小的N个数用法同上。

注意:在官方给出来的文档中写道使用复合操作方法会比使用单行为操作方法会更快一些。例如使用heappushpop( )方法会比先使用heappush( )再使用heappop( )这两单个方法效率来说会更高。

例子

在上篇文章中讲到的堆排序如果用到heapq模块就会变得非常好写。首先我们只需要建立一个空堆然后将数导入堆中,再进行弹出操作这样就形成了一个堆排序。

def heapsort(iterable):
    h = []
    for value in iterable:
        heapq.heappush(h,value) #[0, 1, 2, 6, 3, 5, 4, 7, 8, 9]
    return [heapq.heappop(h) for i in range(len(h))]
print heapsort([1,3,5,7,9,2,4,6,8,0]) 

在heappush方法的时候heapq就自动给你建立好了一个堆。当然如果对于已有的列表转换成堆也好办,heapq给我们提供了heapify( )方法。

def HeapSort(list):
    heapq.heapify(list)
    heap = []
    while list:
        heap.append(heapq.heappop(list))
    list[:] = heap
    return list
print HeapSort([1,3,5,7,9,2,4,6,8,0])

当然单个的数列明显不是堆的正常要求,我们可以使用数组的形式来筛选出我们想要的值。这样的话我们能够快速的对字典中我们想要的值做查找,利用刚刚我们讲到的nlargest和nsmallest。

>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')

相关文章

  • python 中的堆

    heapqimport heapqheap = [] #创建了一个空堆heappush(heap,item) #往...

  • Python中的堆问题

    Heap in python Heap,即堆,也就是优先队列。我们可以在这里找到[]维基百科](https://e...

  • 如何辨别python2?转python3 | v1.2

    教学视频中,如何辨别python2? 学习python,免不了收集一大堆的教学视频,如前篇说到,python 3 ...

  • Python程序基本组成与输入输出

    变量与类型 在python程序中,一切数据结构都是存储在堆空间中的对象。python程序中的变量都是引用变量,可以...

  • Python程序的组成

    变量与类型 在python程序中,一切数据结构都是存储在堆空间中的对象。python程序中的变量都是引用变量,可以...

  • 堆1 最小的k个数 / 数据流第k大元素

    首先认识堆: 1、认识python3中关于堆的函数 1)heapq.heapify可以原地把一个list调整成堆[...

  • python内置的堆、栈和队列

    本文用于介绍python中内置的堆、栈和队列结构方法,并且计较这些方法的差异与使用场景。 heapq 堆队列 he...

  • 堆python实现

    堆 堆是一颗完全二叉树 任意节点的左孩子和右孩子比该节点值大时,是小顶堆任意节点的左孩子和右孩子比该节点值小时,是...

  • Python堆及堆排序之heapq

    Python堆及堆排序之heapq 什么是堆:堆是二叉树,最大堆中父节点大于或等于两个子节点,最小堆父节点小于或等...

  • Python heapq 堆数据结构

    Python heapq 堆数据结构 问题 : 我们想在某个集合中找出最大或最小的N个元素 heapq 说明 : ...

网友评论

      本文标题:python 中的堆

      本文链接:https://www.haomeiwen.com/subject/ekxfyftx.html