堆的实现

最小的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)的实现相关推荐

  1. python之堆heapq模块

    python之堆heapq模块 堆是一种特殊的树形结构,通常我们所说的堆的数据结构指的是完全二叉树,并且根节点的值小于等于该节点所有子节点的值. 堆是非线性的树形的数据结构,有两种堆,最大堆与最小堆. ...

  2. [转载] python中 堆heapq以及 队列queue的使用

    参考链接: Python中的堆队列(Heap queue或heapq) python中 堆heapq以及 队列queue的使用 1. 堆heapq的使用 ## -------------------- ...

  3. python 中的最大堆和最小堆(heapq库)

    目录 首先来看一下什么是最大堆和最小堆? python heapq库中的一些常用方法 小试牛刀 首先来看一下什么是最大堆和最小堆? 最大堆:一种经过排序的完全二叉树,其中任意非终端节点数值均不小于其左 ...

  4. python 最小堆类型: heapq

    目录 1.heapq 的常用方法 2.几个例子 a.最小堆的创建以及增删 b.如何使用 heapq 创建最大堆 c.获取第 k 大/第 k 小数据 d.列表中的元素是元组 heapq 是 python ...

  5. 77. Leetcode 1439. 有序矩阵中的第 k 个最小数组和 (堆-技巧二-多路归并)

    技巧二 - 多路归并其实这个技巧,叫做多指针优化可能会更合适,只不过这个名字实在太过朴素且容易和双指 针什么的混淆,因此我给 ta 起了个别致的名字 - 多路归并.多路体现在:有多条候选路线.代码上, ...

  6. python标准库模块_Python标准库模块之heapq

    该模块提供了堆排序算法的实现.堆是二叉树,最大堆中父节点大于或等于两个子节点,最小堆父节点小于或等于两个子节点. 创建堆 heapq有两种方式创建堆, 一种是使用一个空列表,然后使用heapq.hea ...

  7. python堆模块_python内置堆模块

    heapq python内置heapq模块,通过import heapq导入. heapq模块是用于堆实现优先队列.我们知道队列是先进先出(FIFO), heapq中的优先队列指的是不论谁先进,最小的 ...

  8. Python基础篇(十六)-- Python标准库模块之heapq与bisect

    1 heapq 1.1 介绍 堆是非线性的树形的数据结构,有2种堆,最大堆与最小堆.Python 的heapq 模块默认的是最小堆.堆数据结构最重要的特征是 heap[0] 永远是最小的元素. 最大堆 ...

  9. python常用标准库有哪些-Python - 常用标准库

    sys 和Python解释器关系密切的标准库 sys.__doc__中已经说明了:这个模块提供了对一些对象的访问使用或维护的解释器和交互的功能强的解释 sys.argv 变量,专门用来向Python解 ...

最新文章

  1. SAP客户合作伙伴关系使用说明
  2. zimbra邮件服务器配置,Zimbra邮件服务器无需登录任意邮箱伪造漏洞修复
  3. Boost Asio总结(15)class basic_stream_socket
  4. java中的lastIndexOf( )函数是什么意思
  5. 2、matplotlib中的 ax=fig.add_axes([0,0,1,1])详解
  6. 基于Python和MySQL的学生信息管理系统
  7. SQLSERVER2008-数据库可疑的解决步骤
  8. 51单片机 酒精浓度测试仪
  9. 【PICkit3】PICkit3 Programmer烧写教程
  10. CAD命令输入、结束、重复、撤销
  11. html实现播放暂停,html如何实现播放和暂停
  12. dns远程服务器未响应,dns服务器未响应的解决方法
  13. IntelliJ IDEA快速入门 | 第三十篇:如何来自定义模板呢?
  14. Google地图的Street View和Mapplets
  15. 科研实验用,TPGS-COOH羧基修饰维生素E聚乙二醇琥珀酸酯
  16. 山洪灾害监测预警系统
  17. argox打码机的pplb指令开发
  18. 牛奶可乐经济学之Q6:为什么有不少学校要求学生穿校服?
  19. Oracle 12c数据库优化器统计信息收集的最佳实践
  20. 博图CPU版本不一致

热门文章

  1. 分析器错误信息: 未能加载类型命名空间.类...
  2. 白话编程辅助工具perl2exe(Reship)
  3. keepalived+lvs+nginx高可用
  4. MySQL学习之备份
  5. PHP 五大运行模式
  6. 2017-11-14【Python】爬虫练习
  7. 计算机和HMI设备通信之程序上下载
  8. SQL Server - SQL Server 2016新特性之 --- Query Store
  9. Oracle11g手动创建数据库方法
  10. 关于ssh的一篇很好的文章