python3 堆

【LeetCode 中等 堆 python3】 215. 数组中的第K个最大元素 想要看更加舒服的排版、更加准时的推送 关注公众号“不太灵光的程序员” 每日八点有干货推送,微信随时解答你的疑问 151 翻转字符串里的单词 python3 中等 字符串 给定一个字符串,逐个翻转字符串中的每个单词。 示例 1: 输入: “the sky is blue” 输出: “blue is sky the” 示例 2: 输入: " hello world! " 输出: “world! hello” 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 示例 3: 输入: . 阅读详情

完全二叉树

一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。

完全二叉树判定算法思路

判断一棵树是否是完全二叉树的思路:

  1. 如果树为空,则直接返回错
  2. 如果树不为空:层序遍历二叉树
    1. 如果一个结点左右孩子都不为空,则pop该节点,将其左右孩子入队列;
    2. 如果遇到一个结点,左孩子为空,右孩子不为空,则该树一定不是完全二叉树;
    3. 如果遇到一个结点,左孩子不为空,右孩子为空;或者左右孩子都为空;则该节点之后的队列中的结点都为叶子节点;该树才是完全二叉树,否则就不是完全二叉树;

堆(heap)

又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。

堆需要满足的条件:

1. 必须是二叉树,且必须是完全二叉树

2. 各个父节点必须大于或小于左右结点, 其中最顶层的根结点必须是最大或者最小的

1.最大堆的实现

1.初始化堆

堆可以使用list实现,就是按照层序遍历顺序将每个节点上的值存放在数组中。

parent = i,         #  i 从 0 开始

left = 2 * i + 1

right = 2 * i + 2

2.在堆中增加元素

3.删除根节点,并重建堆结构

# 最大堆的实现
class MaxHeap():
    def __init__(self, maxSize=None):
        self.maxSize = maxSize
        self.li = [None] * maxSize
        self.count = 0

    def length(self):
        # 求数组的长度
        return self.count

    def show(self):
        if self.count <= 0:
            print('null')
        else:
            print(self.li[: self.count])

    def add(self, value):
        if self.count >= self.maxSize:  # 判断是否数组越界
            raise Exception('full')

        self.li[self.count] = value  # 将新节点增加到最后
        self._shift_up(self.count)  # 递归构建大堆
        self.count += 1

    def _shift_up(self, index):
        # 往大堆中添加元素,并保证根节点是最大的值:
        # 1.增加新的值到最后一个结点,在add实现; 2.与父节点比较,如果比父节点值大,则交换
        if index > 0:
            parent = (index - 1) // 2  # 找到根节点
            if self.li[index] > self.li[parent]:  # 交换结点
                self.li[index], self.li[parent] = self.li[parent], self.li[index]
                self._shift_up(parent)  # 继续递归从底往上判断

    def extract(self):
        # 弹出最大堆的根节点,即最大值
        # 1.删除根结点,将最后一个结点作为更结点 ; 2.判断根结点与左右结点的大小,交换左右结点较大的
        if not self.count:
            raise Exception('null')
        value = self.li[0]
        self.count -= 1
        self.li[0] = self.li[self.count]  # 将最后一个值变为第一个
        self._shift_down(0)
        return value

    def _shift_down(self, index):
        # 1.判断是否有左子节点并左大于根,左大于右;2.判断是否有右子节点,右大于根
        left = 2 * index + 1
        right = 2 * index + 2
        largest = index
        # 判断条件
        if left < self.length() and self.li[left] > self.li[largest]:
            largest = left
        if right < self.length() and self.li[right] > self.li[largest]:
            largest = right

        if largest != index:  # 将 两者交换
            self.li[index], self.li[largest] = self.li[largest], self.li[index]
            self._shift_down(largest)


import numpy as np
m = MaxHeap(10)
np.random.seed(123)
num = np.random.randint(100, size=10)  # 创建随机的10个数
print(m.length())
for i in num:
    m.add(i)
m.show()
print(m.length())
for i in range(5):
    print(m.extract(), end=' ,')
RT-Thread 5.1.0 实战:手把手教你用CubeMX和RT-Studio创建第一个工程(附常见编译错误修复) 本文详细介绍了如何使用STM32CubeMX和RT-Thread Studio 5.1.0创建第一个RT-Thread工程,包括开发环境准备、CubeMX配置、工程整合及常见编译错误修复。通过实战指南,帮助开发者快速上手RT-Thread 5.1.0,解决开发过程中的典型问题,提升嵌入式开发效率。 阅读详情

相关推荐

单细胞轨迹分析实战:基于Monocle和CytoTRACE的细胞分化潜能与状态解析

本文提供了基于Monocle和CytoTRACE的单细胞轨迹分析实战指南。通过乳腺癌数据集,详细演示了从数据准备、伪时序分析、细胞分化潜能评估到分支点功能挖掘的全流程。结合两种工具的优势,能有效解析细胞状态动态演变,为发育和疾病研究提供关键见解。

weixin_29070861的博客 478

基于Python3的数据结构与算法 - 05 堆排序

二叉树:度不超过2的树,即每个节点最多有两个孩子节点,且两个孩子节点被区分为左孩子节点和右孩子节点。满二叉树:一个二叉树,如果每一层的结点数都达到最大值,则这个二叉树就是满二叉树。叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。从满二叉树最后一层拿走几个节点;即相对于满二叉树,最下面一层可以不满,但必须从左到右依次排过来堆:一种特殊的完全二叉树结构。大根堆:一棵完全二叉树,满足任一节点都比其孩子节点大小根堆:一棵完全二叉树,满足任一节点都比其孩子节点小。

weixin_47702917的博客 966

别再混淆了!一文彻底搞懂STM32的BootROM、BootLoader和启动模式(附启动流程图)

本文深入解析STM32的启动机制,详细讲解BootROM、BootLoader与启动模式的区别与联系,并提供实战指南。通过清晰的启动流程图和配置示例,帮助开发者彻底理解STM32启动流程,解决常见的启动问题,提升嵌入式开发效率。

weixin_33728268的博客 538

python3中的heapq模块(堆排序)使用

heapq-堆排序算法:heapq实现了一个适合与Python的列表一起使用的最小堆排序算法。堆就是用数组表示的二叉树,分为大根堆和小根堆,大根堆为堆顶元素最大的堆,小根堆为堆顶元素最小的堆。

flyingluohaipeng的博客 9241

抓包工具(五)2025版 Burp Suite Professional的下载、安装、使用

抓包工具(五)2025版 Burp Suite Professional的下载、安装、使用

ACGkaka的博客 2万+

QT插件学习系列(一) 初识QtPlugin

QT插件学习系列(一) 初识QtPlugin 1、 概述 为什么我们要学习插件化,其和 windows 导出 dll 有什么区别呢? 导出的动态库如果缺失,程序不能运行。但插件可以。 同一套代码,即可分别在 windows 下和 linux 下生成插件。 QT 本身提供两种插件支持,一种称为高级 API,一种称为低级 API。 高级API的作用是扩展 QT 程序本身,需要子类化 QT 提供的插件基类,例如现有的 QTSqlDriver,因此你可也以编写自己的 QTStyle 扩展 QT。 低级

L_Andy的专栏 3113

python3入门之堆(heapq)

堆是一个二叉树,其中每个父节点的值都小于或等于其所有子节点的值。整个堆的最小元素总是位于二叉树的根节点。python的heapq模块提供了对堆的支持。 heapq.heappush(heap,item) 注:heap为定义堆,item增加的元素>>> import heapq >>> h = [] >>> heapq.heappush(h,2) >>> h [2]heapq.heapify(lis

u013206202的博客 1万+

《解锁GCC版本选择的奥秘:从入门到精通》

GCC 版本的选择是一项复杂而关键的决策,犹如一场精心策划的战略布局,贯穿于软件开发的整个生命周期。从项目需求与兼容性的深度考量,到性能与稳定性的权衡抉择,再到硬件与系统适配的精准对接,每一个环节都紧密相连,相互影响。在游戏开发行业,对性能的极致追求促使开发者青睐较新的 GCC 版本,以实现更流畅的游戏体验和更震撼的视觉效果;科学计算领域则依赖于 GCC 版本对复杂数学运算的高效优化,以应对大规模数据处理的挑战;嵌入式开发行业因硬件资源的限制和对稳定性的严苛要求,通常选择经过长期验证的稳定版本;

zheng_ruiguo的专栏 1418

Python精进系列:heapq 模块

Python heapq 模块是一个处理堆数据结构的强大工具。堆这种数据结构,以其独特的二叉树特性,在众多算法和数据处理场景中扮演着关键角色。

进一步有进一步的欢喜~ 2503

从零开始:Vivado中自定义串口通信IP核的完整实现

本文详细介绍了在Vivado中从零开始实现自定义串口通信IP核的完整流程,包括Verilog核心代码编写、仿真验证、IP核封装与参数化配置技巧。通过AXI-Lite总线实现动态配置,提升FPGA开发效率,适用于各种嵌入式系统通信需求。

weixin_29274969的博客 326

勇攀数字高峰

摘要:该题目要求在数字地形图中寻找从最低点到最高点的所有严格递增登山路径。采用DFS深度优先搜索结合回溯算法,通过标记已访问位置并检查高度差限制(0<diff≤maxDiff)来遍历所有可能路径。算法首先确定起点(最低点)和终点(最高点),然后进行DFS搜索,每步移动需满足四个方向的合法移动且高度严格递增。最终输出符合条件的路径总数。提供了C++、Java和Python三种实现方案。

面试高手的博客 622

[python3] 堆 优先队列(priorityqueue) heapq模块

前言 python3的heapq模块提供了堆的数据结构(即优先队列)。 索引 一、堆排序 二、基本push pop 三、其他         1. 返回堆排序         2. push+pop组合操作         3.列表连接+堆排序组合操作 heapq方法 一

wingaso的博客 2394

23、电器元件符号及封装大全(2025版本)

总计28类电器元件符号和封装。

XU157303764的博客 2656

Python3通过heapq模块创建堆

Python3中内置的堆模块为:heapq 使用时直接导入即可: import heapq 可以打印出heapq内置的方法: print(dir(heapq)) 在具体介绍几个常用函数之前,要明确一下,heapq默认支持的堆类型为:小根堆。 如果,希望使用大根堆,可通过对元素反向比较大小实现。 所谓反向比较大小,对int来说,即原本使用heapq存x为小根堆,那么现在使用heap...

hopyGreat的博客 1162

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

python3网络爬虫(堆糖网)

利用py3进行堆糖网图片爬取

wuyou5566的博客 1244

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

python3 小根堆巧变大根堆

python3 小根堆巧变大根堆

YMWM_的博客 357

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

每日python练习3-堆

堆 应用场景: 给定一个无序数组,要求找出前 k 个最大数 堆排序 查找第K大(小)元素 优先队列 求动态集合中位数 定义: 堆(heap),又被为优先队列(priority queue),即优先级高的先出队。简易理解:堆是一种数学模型,一种排序方式。能满足以上应用场景。 性质: 堆必须符合以下两个条件: 是一棵完全二叉树。 任意一个节点的值都大于(或小于)左右子节点的值。 若父节点都大于等于左右子节点,则被称为大顶堆,反之,若父节点都小于等于左右子节点则为小顶堆。 内部实现机制: 以小顶堆举例:

SYNOPSIS123的博客 284

Python3实现最小堆建堆算法

今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构的时候有个堆排序算法,所以顺便研究了一下“堆”结构(这里特指二叉堆)。 概念 所谓二叉堆(binary heap)实际上就是一颗特殊的完全二叉树,其特殊性在于: 二叉树中所有的父节点的值都不...

weixin_30640291的博客 319

python 最小值算法_Python3实现最小堆建堆算法

今天看Python CookBook中关于“求list中最大(最小)的N个元素”的内容,介绍了直接使用python的heapq模块的nlargest和nsmallest函数的解决方式,记得学习数据结构的时候有个堆排序算法,所以顺便研究了一下“堆”结构(这里特指二叉堆)。概念所谓二叉堆(binary heap)实际上就是一颗特殊的完全二叉树,其特殊性在于:二叉树中所有的父节点的值都不大于/不小于其子...

weixin_39610774的博客 194

python3网络爬虫(2.1):爬取堆糖美女

额,明明记得昨晚存了草稿箱,一觉醒来没了,那就简写点(其实是具体怎么解释我也不太懂/xk,纯属个人理解,有错误还望指正) 环境:   版本:python3   IDE:pycharm2017.3.3   浏览器:火狐(浏览器建议火狐,Chrome)   爬取网站:堆糖 选堆糖是因为比较好爬取(除了img文件就是xhr文件),别网站的反爬取对我这个水平来说都太心机了 安装配置什么的之前...

weixin_30639719的博客 107

python每天必练_每日python练习3-堆

堆应用场景:给定一个无序数组,要求找出前 k 个最大数堆排序查找第K大(小)元素优先队列求动态集合中位数定义:堆(heap),又被为优先队列(priority queue),即优先级高的先出队。简易理解:堆是一种数学模型,一种排序方式。能满足以上应用场景。性质:堆必须符合以下两个条件:是一棵完全二叉树。任意一个节点的值都大于(或小于)左右子节点的值。若父节点都大于等于左右子节点,则被称为大顶堆,反...

weixin_36296864的博客 177

python3堆排序_Pythonの堆排序(最小堆)

1.[代码][Python]代码# -*- coding: utf-8 -*-def parent(i):"""父结点下标"""return int((i - 1) >> 1); # floor((i-1)/2)def left(i):"""左儿子下标"""return (i << 1) + 1; # 2i + 1def right(i):"""右儿子下标"""return...

weixin_39653361的博客 210

【python3数据结构】堆heap

# -*- coding: utf-8 -*- # @Date : 2019/11/29 # @File : myHeap.py class PriorityQueueBase(object): class Item: __slots__ = ['_key', '_value'] def __init__(self, k, v): ...

zc_stats的博客 235

Python3 堆操作heapq中提供的方法

heapq中常用方法如下: from heapq import * heapify(heap)#将heap这个列表转为堆,无需返回值 heappush(heap, item)#将 item加入堆heap。 heappop(heap)#将堆中最小元素弹出。 item=heap[0]#查看堆中最小元素 heapreplace(heap, x)#将堆中最小元素弹出,并将元素x 入堆。 merge(*it...

Cony_14的博客 315
上一篇: 3-2 数组中常见问题-解决方法-对撞指针
SIONCIOSC
博客等级 码龄16年 2粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值