Binary Heap 二叉堆 (二)

一、二叉堆

       二叉堆本质上是一种完全二叉树

       它分为两类:最大堆和最小堆。最大堆的任何一个父节点的值都大于或等于它左右孩子节点的值;最小堆的任何一个父节点的值,都小于或等一它左右孩子节点的值。

      二叉堆虽然是一个完全二叉树,但它的存储方式并不是链式存储,而是顺序存储。换句话说,二叉堆的所有节点都存储在数组中。

假设"第一个元素"在数组中的索引为i,则父节点和子节点的位置关系如下:

索引为i的父节点的下标:(i-1)/2

索引为i的左孩子的下标:2*i+1

索引为i的右孩子的下标:2*i+2

二、二叉堆操作

1、添加节点

1、新元素一律先插入到堆的尾部

2、依次向上调整整个堆的结构(一直到根即可)

 元素添加到队尾  

 持续向上移动并交换 

 

如上图所示: 

class BinaryHeap:
    def __init__(self):
        '''初始化数组'''
        self.data = [None]

    def get_parent_index(self, index):
        '''
        父节点索引
        :param index:
        :return:
        '''
        # 判断数组是否越界
        if index == 0 or len(self.data) - 1 < index:
            return None
        # 返回父节点  等价于 (index -1)>>1
        return (index -1) // 2

    def insert(self, data):
        """
        1. 先把元素放到最后, 然后从后往前依次堆化
        2. 大堆顶为例, 如果插入元素比父节点大, 则交换, 直到最后
        :param data:  插入元素
        :return: 返回数组
        """
        self.data.append(data)
        index = len(self.data) - 1  # 插入元素的下标
        parent = self.get_parent_index(index)
        # 判断父节点不为空,且父节点元素<子节点元素,循环
        while parent is not None and self.data[parent] < self.data[index]:
            # 交换
            self.data[parent], self.data[index] = self.data[index], self.data[parent]
            #元素下标为之前父节点,继续初始化值
            index = parent
            parent = self.get_parent_index(parent)
        return self.data


# 使用示例

if __name__ == '__main__':
    #二叉堆对象
    heap = BinaryHeap()
    ll=[100,90,80,70,60,20,33,15,50]
    print(ll)
    #数组
    heap.data=ll
    #添加数据
    print(heap.insert(95))

 

2、删除节点

1、将堆尾元素替换到顶部(即对顶被替代删除掉)

2、依次从根部向下调整整个堆的结构(一直到堆尾即可) 

删除元素100

​​​​​​​

如上图所示: 

class BinaryHeap:
    def __init__(self):
        '''初始化数组'''
        self.data = [None]

    def removeMax(self):
        # 保存删除的元素
        remove_data = self.data[0]
        # 首尾互换参数
        self.data[0] = self.data[-1]
        #删除最后一个
        del self.data[-1]

        # 堆化
        self.heapify(0)
  
        return self.data

    def heapify(self, index):
        # 从上往下堆化,从index 开始堆化操作 (大顶堆)
        total_index = len(self.data) - 1
        while True:
            maxvalue_index = index
            # 左右子节点索引
            left = 2 * index + 1
            right = 2 * index + 2
            #查找根,左,右中最大值
            if left <= total_index and self.data[left] > self.data[maxvalue_index]:
                maxvalue_index = left
            if right <= total_index and self.data[right] > self.data[maxvalue_index]:
                maxvalue_index = right
            if maxvalue_index == index:
                break
            self.data[index], self.data[maxvalue_index] = self.data[maxvalue_index], self.data[index]
            index = maxvalue_index



if __name__ == '__main__':
    #二叉堆对象
    heap = BinaryHeap()
    ll=[100,90,80,70,60,20,33,15,50,40]
    print(ll)
    #数组
    heap.data=ll
    #删除最大元素
    print(heap.removeMax())

 

 

 由此得出:Binaey Heap 的 find Min/Max 的时间复杂度为 o(1),其余时间复杂度为 o(logn)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/556827.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国产数据库实践:亚信安慧AntDB在DTC 2024展示创新实力

4月12至13日&#xff0c;我国数据库行业最具影响力的活动之一——第十三届『数据技术嘉年华』(DTC 2024) 在京成功举办&#xff0c;业内众多专家学者、技术领袖、各行业客户和实力厂商均到场参会。亚信安慧AntDB数据库总架构师洪建辉受邀参与“数据库一体化”专题论坛&#xff…

XDEFIANT不羁联盟怎么申请测试 不羁联盟参与测试教程

《不羁联盟》有五个独具特色的阵营可供选择&#xff1a;自由武装、暗影小队、梯队、净化者、DedSec&#xff0c;全部出自育碧知名的角色与世界。无论是拥有“声纳护目镜”超能的梯队探员&#xff0c;还是拥有黑入对手设备能力的 DedSec&#xff0c;每个阵营都有自己的一套独特技…

MySQL 8.0 新特性之 Clone Plugin

个人感觉&#xff0c;主要还是为 Group Replication 服务。在 Group Replication 中&#xff0c;如果要添加一个新的节点&#xff0c;这个节点差异数据的补齐是通过分布式恢复&#xff08; Distributed Recovery &#xff09;来实现的。 在 MySQL 8.0.17 之前&#xff0c;只支…

第二证券|突发!美联储释放重磅信号,中国资产大涨

美联储稀有开释“加息”信号。 北京时刻4月18日晚间&#xff0c;有“美联储三把手”之称的享有FOMC&#xff08;美国联邦公开商场委员会&#xff09;永久投票权的美国纽约联储主席威廉姆斯宣布说话。他正告称&#xff0c;假如数据显现&#xff0c;美联储需求加息&#xff0c;以…

Python Flask Web框架快速入门

Flask 入门Demo Flask 开发环境搭建&#xff0c;执行如下指令&#xff1a; pip install flask # 第一节: Flask 快速入门from flask import Flask app Flask(__name__)app.route(/flask) def hello_flask():return Hello Flaskapp.run() 核心代码剖析&#xff1a; 从 fla…

【机器学习】小波变换在特征提取中的实践与应用

小波变换在特征提取中的实践与应用 一、小波变换的基本原理与数学表达二、基于小波变换的特征提取方法与实例三、小波变换在特征提取中的优势与展望 在信号处理与数据分析领域&#xff0c;小波变换作为一种强大的数学工具&#xff0c;其多尺度分析特性使得它在特征提取中扮演着…

2024最新面试跳槽,软件测试面试题的整理与解析

今天接着来说说测试工程师面试比较高频的面试题&#xff0c;大家可以通过面试题内的一些解析再结合自己的真实工作经验来进行答题思路的提取、整理。 硬背答案虽可&#xff0c;但容易翻车哦。能够举一反三才是重点&#xff01; 1&#xff1a;请介绍一下UI自动化测试中三种时间等…

解线性方程组——上三角、下三角,回代算法 | 北太天元

解上三角(回代) a i i ≠ 0 a_{ii\neq0} aii0​ , i 1 , 2 , … , n i1,2,\ldots,n i1,2,…,n a 11 x 1 a 12 x 2 ⋯ a 1 n x n b 1 a 22 x 2 ⋯ a 2 n x n b 2 ⋯ a n n x n b n \begin{aligned} a_{11}x_1a_{12}x_2\cdotsa_{1n}x_n&b_1 \\ a_{22}x_2\cdotsa_…

从零开始搭建社交圈子系统:充实人脉的最佳路径

线上交友圈&#xff1a;拓展社交网络的新时代 线上交友圈是社交网络的新引擎&#xff0c;提供了更广泛的社交机会&#xff0c;注重共同兴趣的连接&#xff0c;强调多样性的社交形式&#xff0c;更真实地展示自己&#xff0c;让朋友更全面地了解我们的生活状态。虽然虚拟交往存在…

【智能算法】饥饿游戏搜索算法(HGS)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;Yang等人受到自然界饥饿驱动的活动和动物的行为选择启发&#xff0c;提出了饥饿游戏搜索算法&#xff08;Hunger Games Search, HGS&#xff09;。 2.算法原理 2.1算法思想 HGS…

SPN的相关利用(下)

Kerberoasting kerberos通信过程&#xff1a; 在TGS-REQ中会发出ST服务票据获取servicePrincipalName(SPN)&#xff0c;该SPN是用户或者机器用户注册的。TGS-REP中TGS会返回给user一个ST&#xff0c;而ST是由user请求的server的密码进行加密的&#xff0c;我们可以从TGS-REP中…

RT-Thread时钟管理

操作系统需要通过时间来规范其任务,主要介绍时钟节拍和基于时钟节拍的定时器。 时钟节拍 任何操作系统都需要提供一个时钟节拍,以供系统处理所有和时间有关的事件,如线程的延时、线程的时间片轮转调度以及定时器超时等。 RT-Thread 中,时钟节拍的长度可以根据 RT_TICK_P…

Module外贸主题开心版下载-v5.7.0版本WordPress企业模板

主题下载地址&#xff1a;Module外贸主题开心版下载-v5.7.0版本 Module主题介绍&#xff1a;采用全新模块化开发&#xff0c;首页模块可视化拖拽自由组合&#xff0c;可自定义搭建出不同行业适用的企业网站。同时主题全面支持WPML多语言切换&#xff0c;可轻松搭建外贸网站。W…

JetBrains Rider 2024.1.1 .NET集成开发环境 mac/win

JetBrains Rider是一个新的跨平台的基于Inte lliJ平台和ReSharper的. NET集成技术开发工作环境。 Rider提供了大量人工智能系统代码进行编辑管理功能&#xff0c;如不同类型的代码可以完成、自动设备名称发展空间设计导入、自动通过插入大括号和突出研究显示信息匹配作为分隔符…

torchEEG工具箱

文章信息: 题目&#xff1a;TorchEEGEMO&#xff1a;基于脑电图的情绪识别深度学习工具箱 期刊&#xff1a;Expert Systems with Applications 环境&#xff1a;pytorch 1.11.0 CUDA 11.3 摘要&#xff1a; ​ 一个python工具箱TorchEEG&#xff0c;将工作流程分为五个模块…

软考 - 系统架构设计师 - 架构风格例题

问题一&#xff1a; 什么是软件架构风格&#xff1f; 软件架构风格指特定软件系统组织方式的惯用模式。组织方式描述了系统的组成构件和这些构件的组织方式。惯用模式反映了众多系统所共有的结构和语义。 集成开发环境与用户的交互方式 &#xff08;实际上询问在交互方面&am…

干货-PMP常考知识点,都给你们汇总到这里了

PMP认证考试考来考去&#xff0c;其实就是那些知识点。把这些知识点吃透了&#xff0c;你会发现做题稳准狠。不仅速度快&#xff0c;正确率也有很大的提升。 我们结合了10几年PMP备考辅导经验&#xff0c;给大家梳理了这些PMP常考的知识点集锦&#xff0c;希望能帮到大家&#…

css中all 的使用记录

all 在 CSS 中是一个特殊的属性值&#xff0c;它允许我们重置元素或元素父级的所有属性到其初始值、继承的值或取消设置的值。这一属性非常有用&#xff0c;特别是在需要快速重置多个属性的情况下&#xff0c;它避免了逐一设置每个属性的繁琐过程。 先看一下浏览器兼容性&#…

【SAP HANA 15】SQL锁表 (查询,解锁)

锁表查看 --锁表检查语句 SELECT C.CONNECTION_ID,PS.STATEMENT_STRINGFROM M_CONNECTIONS C JOIN M_PREPARED_STATEMENTS PSON C.CONNECTION_ID PS.CONNECTION_ID AND C.CURRENT_STATEMENT_ID PS.STATEMENT_IDWHERE C.CONNECTION_STATUS RUNNINGAND C.CONNECTION_TYPE Re…

第二届数据安全大赛暨首届“数信杯”数据安全大赛数据安全积分争夺赛-东区预赛部分WP

这里写目录标题 检材下载&#xff1a;1.理论题2.数据安全&#xff1a;pb:Sepack&#xff1a; 3.数据分析&#xff1a;数据分析&#xff08;1&#xff09;数据分析1-1:数据分析1-2:数据分析1-3: 数据分析&#xff08;3&#xff09;数据分析3-1&#xff1a;数据分析3-2&#xff1…
最新文章