anspython_python堆(heapq)的实现
堆的实现
最小的K个数。
堆插入、取出都是log(n)的复杂度。
class Heap:
def __init__(self):
self.data_list = []
def insert(self, x):
# 先把元素放在最后,然后从后往前依次堆化
# 这里以大顶堆为例,如果插入元素比父节点大,则交换,直到最后
self.data_list.append(x)
index = len(self.data_list) - 1
while index > 0:
p_index = index >> 1
if self.data_list[index] < self.data_list[p_index]:
self.data_list[index], self.data_list[p_index] = self.data_list[p_index], self.data_list[index]
index = p_index
def top(self):
return self.data_list[0]
def pop(self):
# 删除堆顶元素,然后将最后一个元素放在堆顶,再从上往下依次堆化
remove_data = self.data_list[0]
self.data_list[0] = self.data_list[-1]
self.data_list.pop()
self.heapify(0)
return remove_data
def heapify(self, index):
max_index = len(self.data_list) - 1
while index <= max_index:
maxvalue_index = index
left_index, right_index = (index << 1), (index << 1) + 1
if (left_index <= max_index) and (self.data_list[left_index] < self.data_list[maxvalue_index]):
maxvalue_index = left_index
if (right_index <= max_index) and (self.data_list[right_index] < self.data_list[maxvalue_index]):
maxvalue_index = right_index
if maxvalue_index == index:
break
self.data_list[maxvalue_index], self.data_list[index] = self.data_list[index], self.data_list[maxvalue_index]
index = maxvalue_index
class Solution(object):
def smallestK(self, arr, k):
"""
:type arr: List[int]
:type k: int
:rtype: List[int]
"""
heapq = Heap()
for a in arr:
heapq.insert(a)
# print(heapq.data_list)
ans = []
for _ in range(k):
ans.append(heapq.pop())
return ans
python内置堆heapq
heap是一个list,具有堆特性的heap不一定是排好序的,使用heapq.heappop()出来的结果才是排好序的。
python默认的heapq模块只支持最小堆的构建。最大堆构建时,值可以乘-1,结果也再返回去。
heapq方法用法
heapq.heappush(heap, x)将x压入堆heap中
heapq.heappop(heap)从堆heap中弹出最小的元素
heapq.heapify(heap)让列表heap具备堆特征
heapq.heapreplace(heap, x)弹出最小的元素,并将x压入堆heap中
heapq.nlargest(n, iterable, key=None)返回iter中n个最大的元素
heapq.nsmallest(n, iterable, key=None)返回iter中n个最小的元素
example
import heapq
# 1.创建堆
# 方法一
nums = [3, 2, 4, 8, 3, 1, 4, 9, 4]
my_heapq_1 = []
for num in nums:
heapq.heappush(my_heapq_1, num) # 加入堆
# 方法二
my_heapq_2 = [3, 2, 4, 8, 3, 1, 4, 9, 4]
heapq.heapify(my_heapq_2)
# 2. 访问堆顶
print([heapq.heappop(my_heapq_1) for _ in range(len(my_heapq_1))]) # 堆排序结果
print([heapq.heappop(my_heapq_2) for _ in range(len(my_heapq_2))])
# [1, 2, 3, 3, 4, 4, 4, 8, 9]
# 3.访问堆顶并替换
heapq.heapreplace(my_heapq_1, 23)
print([heapq.heappop(my_heapq_1) for _ in range(len(my_heapq_1))]) # 堆排序结果
# [2, 3, 3, 4, 4, 4, 8, 9, 23]
# 4.最大n个/最小n个。
nlargest = heapq.nlargest(5, my_heapq_1)
nsmallest = heapq.nsmallest(5, my_heapq_1)
print(nlargest, nsmallest)
# [9, 8, 4, 4, 4] [1, 2, 3, 3, 4]
元组堆
import heapq
# 1.创建堆
my_heapq = []
heapq.heappush(my_heapq, (5, 7))
heapq.heappush(my_heapq, (5, 4))
heapq.heappush(my_heapq, (7, 2))
heapq.heappush(my_heapq, (1, 3))
heapq.heappush(my_heapq, (3, 1))
print([heapq.heappop(my_heapq) for _ in range(len(my_heapq))])
# 2.最大n个/最小n个。
nlargest = heapq.nlargest(5, my_heapq, key=lambda e: (e[0], e[1]))
nsmallest = heapq.nsmallest(5, my_heapq, key=lambda e: (e[1], e[0]))
print(nlargest, nsmallest)
anspython_python堆(heapq)的实现相关推荐
- python之堆heapq模块
python之堆heapq模块 堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小于等于该节点所有子节点的值. 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆. ...
- [转载] python中 堆heapq以及 队列queue的使用
参考链接: Python中的堆队列(Heap queue或heapq) python中 堆heapq以及 队列queue的使用 1. 堆heapq的使用 ## -------------------- ...
- python 中的最大堆和最小堆(heapq库)
目录 首先来看一下什么是最大堆和最小堆? python heapq库中的一些常用方法 小试牛刀 首先来看一下什么是最大堆和最小堆? 最大堆:一种经过排序的完全二叉树,其中任意非终端节点数值均不小于其左 ...
- python 最小堆类型: heapq
目录 1.heapq 的常用方法 2.几个例子 a.最小堆的创建以及增删 b.如何使用 heapq 创建最大堆 c.获取第 k 大/第 k 小数据 d.列表中的元素是元组 heapq 是 python ...
- 77. Leetcode 1439. 有序矩阵中的第 k 个最小数组和 (堆-技巧二-多路归并)
技巧二 - 多路归并其实这个技巧,叫做多指针优化可能会更合适,只不过这个名字实在太过朴素且容易和双指 针什么的混淆,因此我给 ta 起了个别致的名字 - 多路归并.多路体现在:有多条候选路线.代码上, ...
- python标准库模块_Python标准库模块之heapq
该模块提供了堆排序算法的实现.堆是二叉树,最大堆中父节点大于或等于两个子节点,最小堆父节点小于或等于两个子节点. 创建堆 heapq有两种方式创建堆, 一种是使用一个空列表,然后使用heapq.hea ...
- python堆模块_python内置堆模块
heapq python内置heapq模块,通过import heapq导入. heapq模块是用于堆实现优先队列.我们知道队列是先进先出(FIFO), heapq中的优先队列指的是不论谁先进,最小的 ...
- Python基础篇(十六)-- Python标准库模块之heapq与bisect
1 heapq 1.1 介绍 堆是非线性的树形的数据结构,有2种堆,最大堆与最小堆.Python 的heapq 模块默认的是最小堆.堆数据结构最重要的特征是 heap[0] 永远是最小的元素. 最大堆 ...
- python常用标准库有哪些-Python - 常用标准库
sys 和Python解释器关系密切的标准库 sys.__doc__中已经说明了:这个模块提供了对一些对象的访问使用或维护的解释器和交互的功能强的解释 sys.argv 变量,专门用来向Python解 ...
最新文章
- SAP客户合作伙伴关系使用说明
- zimbra邮件服务器配置,Zimbra邮件服务器无需登录任意邮箱伪造漏洞修复
- Boost Asio总结(15)class basic_stream_socket
- java中的lastIndexOf( )函数是什么意思
- 2、matplotlib中的 ax=fig.add_axes([0,0,1,1])详解
- 基于Python和MySQL的学生信息管理系统
- SQLSERVER2008-数据库可疑的解决步骤
- 51单片机 酒精浓度测试仪
- 【PICkit3】PICkit3 Programmer烧写教程
- CAD命令输入、结束、重复、撤销
- html实现播放暂停,html如何实现播放和暂停
- dns远程服务器未响应,dns服务器未响应的解决方法
- IntelliJ IDEA快速入门 | 第三十篇:如何来自定义模板呢?
- Google地图的Street View和Mapplets
- 科研实验用,TPGS-COOH羧基修饰维生素E聚乙二醇琥珀酸酯
- 山洪灾害监测预警系统
- argox打码机的pplb指令开发
- 牛奶可乐经济学之Q6:为什么有不少学校要求学生穿校服?
- Oracle 12c数据库优化器统计信息收集的最佳实践
- 博图CPU版本不一致