主要为了刷题时候,总是出现堆和前缀和等python内置库,做个记录
1 heapq
heapq 库是Python标准库之一,提供了构建小顶堆的方法和一些对小顶堆的基本操作方法(如入堆,出堆等),可以用于实现堆排序算法。堆是一种数据结构,是一颗完全二叉树,满足的性质:每个节点的值都大于等于(小于等于)它的左右子节点的值。在python heapq中使用的是小顶堆。
在heapq库中,heapq使用的数据类型是python的基本数据类型list,要满足堆的性质,则在索引k的值要<= 2k+1 和 2k+2 的值。
1.1 heapq创建堆
# coding=utf-8
import heapq
array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
heap = []
for num in array:
heapq.heappush(heap, num)
print("array:", array)
print("heap: ", heap)
heapq.heapify(array)
print("array:", array)
# 打印的结果
'''
array: [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
heap: [5, 7, 21, 15, 10, 24, 27, 45, 17, 30, 36, 50]
array: [5, 7, 21, 10, 17, 24, 27, 45, 15, 30, 36, 50]
'''
heapq中创建堆的方法有两种:
- heappush(heap, num):先创建一个空堆,再将数据一个一个的添加到堆中
- heapify(array):直接接收list数组,将list数组调整为小顶堆
两种方法实现的结果会有差异,如上面的代码中,使用heappush(heap, num)得到的堆结构如下。
使用heapify(array)得到的堆结构如下。
不过,这两个结果都满足小顶堆的特性,不影响堆的使用(堆只会从堆顶开始取数据,取出数据后会重新调整结构)。
1.2 heapq实现堆排序
array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
heap = []
for num in array:
heapq.heappush(heap, num)
print(heap[0])
# print(heapq.heappop(heap))
heap_sort = [heapq.heappop(heap) for _ in range(len(heap))]
print("heap sort result: ", heap_sort)
# 利用heappop可以出堆操作,剩下的数据重新构造成新的小顶堆
# 打印的结果
'''
5
heap sort result: [5, 7, 10, 15, 17, 21, 24, 27, 30, 36, 45, 50]
'''
1.3 获取堆中的最大值或最小值
array = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
heapq.heapify(array)
print(heapq.nlargest(2, array)) # 从小顶堆中选出最大的两个数
print(heapq.nsmallest(3, array))
# 打印的结果
'''
[50, 45]
[5, 7, 10]
'''
1.4 将多个堆进行合并
li=[1, 1, 4, 2, 3, 5, 8]
li1=[2,1,2,3,2,4,6]
heapq.heapify(li)
heapq.heapify(li1)
lists=heapq.merge(li,li1)
print(list(lists))
'''
打印的结果
[1, 1, 2, 1, 2, 3, 2, 4, 2, 3, 4, 5, 6, 8]
'''
2 accumulate
accumulate(可迭代对象),功能是对传进来的iter对象逐个进行某个操作(默认是累加),详情见下面代码
>>> a=[1,2,3,4,5]
>>> b=accumulate(a) #默认是累加
>>> b #这里返回的是一个可迭代对象
<itertools.accumulate object at 0x7f3e5c2f4e48>
>>> list(b) #强制转化
[1, 3, 6, 10, 15]
>>>
传入自己想要的操作,例如换成乘法
>>> import operator
>>> c=accumulate(a,operator.mul)
>>> c
<itertools.accumulate object at 0x7f3e5c2f4f88>
>>> list(c)
[1, 2, 6, 24, 120]
>>>