python中堆的用法

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.mzph.cn/news/882484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日OJ题_牛客_集合_排序_C++_Java

目录 牛客_集合_排序 题目解析 C代码 Java代码 牛客_集合_排序 集合_牛客题霸_牛客网 (nowcoder.com) 题目解析 笔试题可直接用set排序&#xff0c;面试可询问是否要手写排序函数&#xff0c;如果要手写排序&#xff0c;推荐写快排。 C代码 #include <iostream> …

Redis中String类型数据扩容原理分析

大家好&#xff0c;我是 V 哥。在 Java 中&#xff0c;我们有动态数组ArrayList&#xff0c;当插入新元素空间不足时&#xff0c;会进行扩容&#xff0c;好奇 Redis 中的 String 类型&#xff0c;C 语言又是怎样的实现策略&#xff0c;带着疑问&#xff0c;咱们来了解一下。 最…

Lua for循环语句

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 在Lua编程语言中&#xff0c;for循环是执行重复任务的重要结构。它允许开发者按照指定的条件多次运行一段代码&#xff0c;从而简化处理序列、迭代集合或执行…

SOD-YOLOv8 - 增强YOLOv8以在交通场景中检测小目标

原文链接:中英文对照阅读 摘要 计算机视觉中的目标检测对于交通管理,紧急响应,自动驾驶车辆和智能城市至关重要。 尽管在目标检测上有重大进步,但在远程摄像头获取的图像中检测小目标仍具有挑战性,这主要是由于它们的大小、与摄像头的距离、形状的多样性和杂乱的背景所造…

两个数列问题

# 问题描述 给定长度分别为 n 和 m 的两个数列a[n]、b[m]&#xff0c;和一个整数k。求|(a[i] - b[j])^2 - k^2|的最小值。 ## 输入格式 第一行有 2 个整数 n、m、k&#xff0c;分别表示数列 a、b 的长度&#xff0c;以及公式中的整数 k。 第二行有 n 个整数&#xff0c;表示…

重构复杂简单变量之用子类替换类型码

子类替换类型码 是一种用于将类型码替换为子类。当代码使用类型码&#xff08;通常是 int、string 或 enum&#xff09;来表示对象的不同类别&#xff0c;并且这些类别的行为有所不同时&#xff0c;使用子类可以更加清晰地表达这些差异并减少复杂的条件判断。 一、什么时候使用…

SQL 自学:游标(Cursors)的理解与应用

在 SQL 中&#xff0c;游标&#xff08;Cursor&#xff09;是一种用于处理从数据库中检索出的多行数据的机制。它允许我们逐行地处理查询结果集&#xff0c;而不是一次性处理整个结果集。 一、游标是什么 游标可以看作是一个指向结果集的指针。通过游标&#xff0c;我们可以在…

深度学习:终身学习(Life-Long Learning)详解

终身学习&#xff08;Life-Long Learning&#xff09;详解 终身学习&#xff08;也称为持续学习或增量学习&#xff09;是机器学习中的一个重要研究领域&#xff0c;它关注如何使机器学习模型在完成一系列任务后&#xff0c;能够持续学习新任务&#xff0c;而不会忘记之前学到…

集合框架07:LinkedList使用

1.视频链接&#xff1a;13.14 LinkedList使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p142.LinkedList集合的增删改查操作 package com.yundait.Demo01;im…

【判断推理】逻辑论证之归因论证

2.1 归因论证概述 归因&#xff1a;指人们对 他人或自己行为的原因的推论过程。具体而言&#xff0c;就是观察者对他人的行为过程或自己的行为过程所进行的因果解释和推论。&#xff08;通俗而言&#xff0c;归因就是对已经发生的事实&#xff0c;在众多可能的原因中找出一个原…

【大模型问答测试】大模型问答测试脚本实现(第二版)——接入pytest与代码解耦

背景 接上一篇&#xff0c;【大模型问答测试】大模型问答测试脚本实现&#xff08;第一版&#xff09;。 在实现自动化的时候&#xff0c;原先把很多方法与request请求写在一块了&#xff0c;趁着目前实现接口数量较少&#xff0c;决定对代码进行解耦&#xff0c;并且清晰目录…

Qt获取磁盘信息+表格显示

效果展示 主要代码 获取磁盘相关数据 获取磁盘数据 Qt 没有提供相关的接口&#xff0c;需要使用 Windows API。接口解释如下&#xff1a; BOOL GetDiskFreeSpaceExW([in, optional] LPCWSTR lpDirectoryName,[out, optional] PULARGE_INTEGER lpFreeBytesAvailable…

MongoDB Shell 基本命令(一)

MongoDB Shell 基本命令(一&#xff09; 1. 基本概念 SQL术语/概念MongoDB术语/概念解释/说明databasedb数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindex索引table joins表连接,MongoDB不支持primary keyprimary key主键,Mon…

推荐算法的学习

文章目录 前言1、模型1.1 从本领域模型的发展历史中学习1.1.1 在历史中总结发展规律和趋势1.1.2 发现模型之间的共性&#xff0c;方便记忆 1.2 从其他领域的发展中学习1.2.1 注意力机制1.2.2 残差网络 1.3 实践该怎么办&#xff1f; 2、 特征2.1 数据源的选择与建立2.2 特征构造…

Python生成随机密码脚本

引言 在数字化时代&#xff0c;密码已成为我们保护个人信息和数据安全的重要手段。然而&#xff0c;手动创建复杂且难以猜测的密码是一项既繁琐又容易出错的任务。幸运的是&#xff0c;Python编程语言为我们提供了一种高效且灵活的方法来自动生成随机密码。本文将详细介绍如何…

android app执行shell命令视频课程补充android 10/11适配-千里马android

(https://blog.csdn.net/learnframework/article/details/120103471) https://blog.csdn.net/learnframework/article/details/120103471 hi&#xff0c;有学员在学习跨进程通信专题课程时候&#xff0c;在实战app执行一个shell命令的项目时候&#xff0c;对课程本身的android …

Day3 线性表(Linear List)

Day3 线性表&#xff08;Linear List&#xff09; 定义&#xff1a; 是具有相同数据类型的n(n>0)个数据元素的有限序列&#xff0c;其中n为表长&#xff0c;当n0时线性表是一个控标。若用L命名线性表&#xff0c;则其一般表示为&#xff1a;L(a1,a2,a3,a4,.....ai,ai1....…

【高等数学】无穷级数

0. 了解 无穷级数是指将无穷多个数按照一定的规律相加起来的表达式。 打个比方,就像你有一个无穷长的梯子,每一级梯子代表一个数。把这些数一个一个加起来,就形成了无穷级数。 比如常见的等比级数,这里是首项,是公比。如果,这个等比级数是收敛的,也就是它的和是一个有限…

Hackmyvm-Lookup

0x00信息收集 0x01端口扫描 PORT STATE SERVICE 22/tcp open ssh 80/tcp open http MAC Address: 08:00:27:0A:44:CF (Oracle VirtualBox virtual NIC)22/tcp open ssh OpenSSH 8.2p1 Ubuntu 4ubuntu0.9 (Ubuntu Linux; protocol 2.0)80/tcp open http Apache ht…

数据权限的设计与实现系列13——前端筛选器组件Everright-filter集成多控制维度实现

‍ 数据权限多维度实现 上面的所有工作&#xff0c;实际都是基于业务实体属性这一数据权限控制维度展开的。 接下来&#xff0c;我们来设计与实现多维度&#xff0c;主要是用户组&#xff08;即角色&#xff09;、组织机构和用户。 ‍ 业务需求分析 用户控制维度 业务场景…