python中堆的用法

embedded/2024/10/21 3:06:39/

Python 堆(Headp)

Python中堆是一种基于二叉树存储的数据结构。

主要应用场景:

  对一个序列数据的操作基于排序的操作场景,例如序列数据基于最大值最小值进行的操作。

堆的数据结构:

  Python 中堆是一颗平衡二叉树(关于二叉树参考数据结构相关知识),且基于小堆进行存储。

  何为小堆,简单的说就是根节点永远不大于子节点的一种存储树,如下所示:

为何会形成图示的二叉树,这跟二叉树的存储及翻转规则有关,比较复杂,如果感兴趣,可查阅数据结构相关知识。

 特性:

  (1)堆的数据要基于链表(List)进行操作(堆中的数据是基于链表进行操作)。

  (2)堆直接基于链表操作,不再开辟新的存储空间。

  (3)堆头永远都是最小的值。

  (4)堆的检索是根据中序遍历方式:根节点 --> 左节点 -->右节点

常用方法:

 1 import heapq2 3 # (1)创建一个空堆,并加入数据4 heap = []5 for item in [2, 3, 1, 4]:6     heapq.heappush(heap, item)7 print heap     # 输出 [1, 3, 2, 4]8 9 # (2)根据链表构建一个堆 --> heapify
10 l = [2, 3, 1, 4]
11 heapq.heapify(l)
12 print l        # 输出 [1, 3, 2, 4]
13 
14 # (2)向堆中追加元素 -->heappush
15 heapq.heappush(l, -10)
16 print l        # 输出 [-10, 1, 2, 4, 3]
17 
18 # (3) 弹出堆头(返回堆头之后堆再进行翻转,堆头保持最小值) -->heappop
19 print heapq.heappop(l)      # 输出 -10
20 print l                     # 输出 [1, 3, 2, 4]
21 print heapq.heappop(l)      # 输出 1
22 print l                     # 输出 [2, 3, 4]
23 
24 # (4) 替换第一个元素,并构建堆 --> heapreplace
25 l = [2, 3, 1, 4]
26 print heapq.heapreplace(l, 100)     # 输出 2
27 print l                             # 输出 [1, 3, 100, 4]
28 
29 # (5)合并多个链表 --> merge
30 l = [1, 3, 2]
31 l2 = [5, 2, 3]
32 l3 = [9, 2, 3, 1]
33 print list(heapq.merge(l, l2, l3))  # 输出 [1, 3, 2, 5, 2, 3, 9, 2, 3, 1]
34 
35 # (6)多路归并 --> merge
36 #  对每一个链表进行排序,再对排序后的列表进行合并
37 print list(heapq.merge(sorted(l), sorted(l2), sorted(l3)))
38 
39 # (7)返回最大的元素 --> nlargest
40 l = [2, 3, 1, 4]
41 print heapq.nlargest(2, l)     # 输出 [4, 3]
42 
43 # (8)返回最小的元素 --> nsmallest
44 l = [2, 3, 1, 4]
45 print heapq.nsmallest(2, l)     # 输出 [1, 2]
46 
47 # (9)向堆中追加一个数据,再弹出堆头(弹出后堆不会发生翻转) --> heappushpop
48 l = [2, 3, 1, 4]
49 print heapq.heappushpop(l, -10)     # 输出 -10
50 print l                             # 输出 [2, 3, 1, 4]    

http://www.ppmy.cn/embedded/129163.html

相关文章

K8s高级调度--CronJob与污点容忍及亲和力

文章目录 CronJobCronJob 的核心概念Job调度时间表并发策略启动历史保留 CronJob YAML 配置示例Cron 表达式 CronJob 实际应用场景定期数据备份日志清理任务 污点和容忍污点的概念污点的三种效应污点和容忍的工作流程设置污点和容忍1. 给节点添加污点2. 给 Pod 添加容忍 实际应…

LeetCode搜索插入位置

题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 …

六、存储过程和触发器及视图和临时表

一. 存储过程和触发器是数据库中用于实现复杂业务逻辑和自动化操作的重要工具。 下面是对存储过程和触发器的详细讲解和示例说明:存储过程: 存储过程是一组预定义的SQL语句,封装在数据库中并可通过名称调用。存储过程可以接受输入参数和输出…

Win10+Python3.8+GPU版tensorflow2.x环境搭建最简流程(转载学习用)

在开始之前,请确保你的计算机已经安装了Windows 10操作系统,并且具备一个支持CUDA的NVIDIA显卡。 步骤1:安装Python 3.8 你可以选择从Python官网下载Python 3.8的安装包。在下载过程中,请确保勾选“Add Python to PATH”选项&…

gc cr/current block 2-way

官方文档描述 14.9.4 Analyzing Cache Fusion Transfer Impact Using GCS Statistics Describes how to monitor GCS performance by identifying objects read and modified frequently and the service times imposed by the remote access. Waiting for blocks to arrive ma…

java通过模板实现导出

/*** 导出作业票角度统计*/Log(title "导出作业票角度统计", businessType BusinessType.EXPORT)PostMapping("/export")public void export(HttpServletResponse response, PlanWiDto dto) throws IOException {try {ExcelUtil.createExcel(response, &…

线性可分支持向量机的原理推导 9-19基于拉格朗日函数L(w,b,α) 对b求偏导 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析,便于初学者更好的理解。 公式 9-19 是对拉格朗日函数 L ( w , b , α ) L(\mathbf{w}, b, \alpha) L(w,b,α) 中的偏导数进行求解,目的是找到拉格朗日函数对 b b b 的…

东方通 TongHttpServer V6 配置与启动实战指南

东方通 TongHttpServer V6 配置与启动实战指南 文章目录 东方通 TongHttpServer V6 配置与启动实战指南一 简述二 THS 配置1)配置负载均衡请求2)配置前端网页请求3)配置后端反向代理4)完整的 httpserver.conf 三 配置开机启动1&am…