python堆模块_Python模块:heapq堆

这个模块提供了堆队列算法的实现,也称为优先队列算法

堆是一个二叉树,它的每个父节点的值都只会小于或大于所有孩子节点(的值),他使用了数组来实现。堆最小的元素总是在根节点:heap[0]

要创建一个堆,可以使用list来初始化为[],或者你可以通过一个函数heapify(),来把一个list转换成堆

定义了以下函数:

1.heapq.heappush(heap.item)

将item的值加入到heap中,保持堆的不变性

2.heapq.heappop(heap)

弹出并返回heap的最小的元素,保持堆的不变性,抛出IndexError,使用heap[0],可以只访问最小的元素而不弹出它。

3.heapq.heappushpop(heap, item)

将item放入堆中,然后弹出并返回heap的最小元素,该组合操作比先调用heappush(),在调用heappop()运行起来更有效率

4.heapq.heapify(x)

将list x转换成堆,原地,线性时间内

5.heapq.heapreplace(heap, item)

弹出并返回heap中最小的一项,同时推入新的item。堆的大小不变。如果堆为空,则引发IndexError。

这个单步骤操作比heappop()加heappush()更高效,并且在使用固定大小的堆时更为适宜.pop/push组合总是会从堆中返回一个元素并将其替换为item。

返回的值可能会比添加的item更大,如果不希望如此,可考虑改用heappushpop(),它的push/pop组合会返回两个值较小的那个,将较大的值留在堆中.

6.heapq.nlargest(n, iterable, key = None)

从ierable所定义的数据集中返回前n个最大元素组成的列表,如果提供了key则其指定一个单参数的函数,用于从iterable的每个元素中提取比较键(例如key = str.lower),等价于sorted(iterable, key = key, reverse = True)[:n]

7.heapq.nsmallest(n, iterable, key = None)

后两个函数在n值较小的时候性能最好,对于更大的值,使用sorted()函数会更有效率,此外,当n = 1时,使用内置min()和max()函数会更有效率,如果需要重复使用这些函数,请考虑将可迭代对象转为真正的堆。

基本实例:(堆排序)

堆排序可以通过将所有值推入堆中,然后每次弹出一个最小值来实现。

import heapq

def heapSort(array):

l=[]

#循环插入进来for val inarray:

heapq.heappush(l, val)

#每次弹出最小值return [heapq.heappop(l) for i inrange(l)]

例题:寻找第K大

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。

给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

测试样例:

[1,3,5,2,2],5,3

返回:2

# -*- coding:utf-8 -*-

classFinder:

def findKth(self, a, n, K):

# write code here

import heapq

l=[]for val ina:

heapq.heappush(l, val)

count= 1

whileheapq:

pop_num=heapq.heappop(l)if (count == len(a) - K + 1):returnpop_num

count+= 1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值