Python高级语法之堆

特点
  • 堆是一个二叉树,它的每个父节点的值都只会小于或等于所有孩子节点(的值)
  • 它使用了数组来实现:从零开始计数,对于所有的k,都有heap[k] <= heap[2k+1] <=heap[2k+2]
  • 堆最有趣的特性在于最小的元素总在根节点:heap[0]
heapq.heapify(x) 将list x 转换成堆
import heapq
x=[4,5,6,7,9,1,2,3,0]
print(x)
heapq.heapify(x)
print(x)
#结果
#[4, 5, 6, 7, 9, 1, 2, 3, 0]
#[0, 3, 1, 4, 9, 6, 2, 5, 7]
heapq.heappush(heap, item) 将item 的值加入heap中,保持堆的不变性
import heapq
x=[4,5,6,7,9,1,2,3,0]
print(x)
heapq.heappush(x,8)
print(x)
#结果
#[4, 5, 6, 7, 9, 1, 2, 3, 0]
#[4, 5, 6, 7, 8, 1, 2, 3, 0, 9]
heapq.heappop(heap) 弹出并返回heap的最小元素,保持堆的不变性。使用heap[0],可以访问最小的元素而不弹出它
import heapq
x=[4,5,6,7,9,1,2,3,0]
print(x)
heapq.heapify(x)
print(x)
heapq.heappop(x)
print(x)
#结果
#[4, 5, 6, 7, 9, 1, 2, 3, 0]   列表
#[0, 3, 1, 4, 9, 6, 2, 5, 7]   堆
#[1, 3, 2, 4, 9, 6, 7, 5]      取出一个最小元素后的堆
heap.heappushpop(heap, item) 先将item放入堆中,然后弹出heap中最小元素并返回堆的值,堆大小保持不变
import heapq
x=[4,5,6,7,9,1,2,3,0]
print(x)
heapq.heapify(x)
heapq.heappushpop(x,8)
print(x)
#结果
#[4, 5, 6, 7, 9, 1, 2, 3, 0]
#[1, 3, 2, 4, 9, 6, 8, 5, 7]
heap.heapreplace(heap, item) 先弹出heap中最小元素,然后将item放入堆中并返回堆的值,堆大小保持不变
import heapq
x=[4,5,6,7,9,1,2,3,0]
print(x)
heapq.heapify(x)
heapq.heapreplace(x,8)
print(x)
#结果
#[4, 5, 6, 7, 9, 1, 2, 3, 0]
#[1, 3, 2, 4, 9, 6, 8, 5, 7]
heapq.merge(*iterables) 将多个已排序的输入合并为一个以排序的输出(例如:合并来自多个日志文件的带时间戳的条目)。返回已排序值的iterator.
import heapq
x = [5,15,62]
y = [1,7,34,56,88]
z = heapq.merge(x,y)
print(list(z))
#结果
#[1, 5, 7, 15, 34, 56, 62, 88]
heapq.nlargest(n, iterable) 从iterable所定义的数据集中返回前n个最大元素组成的列表
import heapq
x = [1,3,6,8,345,5,525,54,5568,656,33]
lg = heapq.nlargest(4, x)
print(lg)
#结果
#[5568, 656, 525, 345]
heapq.nsmallest(n, iterable)) 从iterable所定义的数据集中返回前n个最小元素组成的列表
import heapq
x = [1,3,6,8,345,5,525,54,5568,656,33]
sm = heapq.nsmallest(4, x)
print(sm)
#结果
#[1, 3, 5, 6]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lilinwang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值