📜  Python堆(1)

📅  最后修改于: 2023-12-03 14:46:43.315000             🧑  作者: Mango

Python堆介绍

什么是堆

在计算机科学中,堆是一种数据结构。堆的主要作用是用来进行排序和管理优先级队列(Priority Queue)。堆是一个二叉树,树中每个节点都有一个值,父节点的值总是大于等于/小于等于子节点的值。这种特殊的二叉树结构被称为“堆”。在父节点大于等于子节点的情况下,被称为“最大堆”;在父节点小于等于子节点的情况下,被称为“最小堆”。

Python堆模块

Python内置了heapq模块,用于实现堆的相关操作。heapq模块提供了以下函数:

heappush(heap, item)

将元素item插入堆heap中,并保持堆的不变性。时间复杂度为O(log n)。

import heapq

heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)

print(heap) # [1, 3, 2]
heappop(heap)

从堆heap中弹出并返回最小的元素,并保持堆的不变性。如果堆heap为空,则会引发IndexError。时间复杂度为O(log n)。

import heapq

heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)

print(heapq.heappop(heap)) # 1
print(heap) # [2, 3]
heappushpop(heap, item)

将元素item插入到堆heap中,并返回弹出的最小元素。时间复杂度为O(log n)。

import heapq

heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)

print(heapq.heappushpop(heap, 0)) # 0
print(heap) # [1, 3, 2]
heapreplace(heap, item)

弹出并返回堆heap中最小的元素,然后将元素item插入到堆heap中。与heappushpop()函数相比,该函数将更快地执行操作,因为它只需要维护堆的不变性,而heappushpop()函数需要执行两个操作。时间复杂度为O(log n)。

import heapq

heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 2)

print(heapq.heapreplace(heap, 0)) # 1
print(heap) # [0, 3, 2]
heapify(heap)

将列表heap转换为一个堆,位于列表的第一个元素是最小元素。这是从O(n)时间生成堆的更快的方法。如果想要在列表上进行建堆,则请使用这个函数。时间复杂度为O(n)。

import heapq

lst = [3, 1, 2]
heapq.heapify(lst)

print(lst) # [1, 3, 2]
nlargest(n, iterable[, key])

从可迭代对象中返回前n个最大元素,按从最大到最小的顺序排序。如果提供了关键字函数,则应用到每个元素上,用于比较排序。时间复杂度为O(nlogk),其中k = min(n,len(iterable))。

import heapq

lst = [3, 1, 2]
print(heapq.nlargest(2, lst)) # [3, 2]
nsmallest(n, iterable[, key])

从可迭代对象中返回前n个最小元素,按从最小到最大的顺序排序。如果提供了关键字函数,则应用到每个元素上,用于比较排序。时间复杂度为O(nlogk),其中k = min(n,len(iterable))。

import heapq

lst = [3, 1, 2]
print(heapq.nsmallest(2, lst)) # [1, 2]