python——heapq模块

简介

堆是一种基本的数据结构,堆的结构是一棵完全二叉树,并且满足堆积的性质:每个节点(叶节点除外)的值都大于等于(或都小于等于)它的子节点。

分类

堆结构分为大顶堆和小顶堆,在heapq中使用的是小顶堆:

  • 大顶堆:每个节点(叶节点除外)的值都大于等于其子节点的值,根节点的值是所有节点中最大的。

  • 小顶堆:每个节点(叶节点除外)的值都小于等于其子节点的值,根节点的值是所有节点中最小的。

用途

  • 构建优先队列
  • 堆排序
  • 快速找出一个集合中的最小值(或者最大值)

heapq库

heapq 库是Python标准库之一,提供了构建小顶堆的方法和一些对小顶堆的基本操作方法(如入堆,出堆等),可以用于实现堆排序算法。

在heapq库中,heapq使用的数据类型是Python的基本数据类型 list ,要满足堆积的性质,则在这个列表中,索引 k 的值要小于等于索引 2k+1 的值和索引 2k+2 的值(在完全二叉树中,将数据按广度优先插入,索引为k的节点的子节点索引分别为2k+1和2k+2)。

heapify(x)

heapq.heapify(x) :在线性时间内将列表 x 转换为堆。

heappush(list,x)

heapq.heappush(列表, item):把值item加到堆队列,此时依然满足堆的特点。

heappop(list)

heapq.heappop(列表) :从堆队列中弹出并返回最小值, 此时依然满足堆的特点。

heap[0]

item = heap[0]:查看堆中最小的值,不弹出。

heapreplace(list,x)

item = heapq.heapreplace(列表,item):从堆队列中弹出最小值,然后将值item加到堆队列,此时依然满足堆的特点且堆大小不变。但是需注意是先弹出再加入。

示例

import heapq
arr = [8,5,2,10]
heapq.heapify(arr)
print(arr) # [2,5,8,10]
print(arr[0]) # 2
heapq.heappush(arr,1)
print(arr[0]) # 1
x=heapq.heappop(arr)
print(x) # 1
print(arr[0]) # 2
y=heapq.heapreplace(arr,0)
print(y) # 2 
print(arr[0]) # 0
posted @ 2022-05-29 22:13  岸南  阅读(89)  评论(0)    收藏  举报