python 短路法提高二叉堆插入效率

2023-10-31

在学习 《problem solving with algorithms and data structure using python》 中的二叉堆时,其插入数据方法是将这个数据放在列表的尾部,然后通过一次次与父节点进行比较,并且交换,实现顺序的改变,原代码如下:

二叉堆插入新数据

    def insert(self, newItem):
        self.heapList.append(newItem)
        self.currentSize = self.currentSize + 1
        self.percUp(self.currentSize)

    def percUp(self, index):
        while index // 2 > 0:
            if self.heapList[index] < self.heapList[index//2]:
                tmp = self.heapList[index // 2]
                self.heapList[index // 2] = self.heapList[index]
                self.heapList[index] = tmp

            index = index // 2

percUp 方法,将新元素逐级对比后,向上移动。然而在分析代码过程中发现,当新代码通过数次交换后,不再大于父节点的值,而新的下标取的是父节点。由于插入新数据是在已构建好的数据顺序基础上进行,原有的数据已经是二叉堆,再进一步检查,则不会发生任何交换。
因此,通过设置短路,将检查中断,返回调用处,而不是从底层检查到根节点。实现代码如下:

二叉堆短路插入检查

    def insert(self, newItem):
        self.heapList.append(newItem)
        self.currentSize = self.currentSize + 1
        self.percUp(self.currentSize)

    def percUp(self, index):
        while index // 2 > 0:
            if self.heapList[index] < self.heapList[index//2]:
                tmp = self.heapList[index // 2]
                self.heapList[index // 2] = self.heapList[index]
                self.heapList[index] = tmp

                index = index // 2

            # if more than parent ,quit
            else:
                return

原文见《problem-solving-with-algorithms-and-data-structure-using-python 中文版》
二叉堆的实现

也许仅仅是性能小小的提升,但对于海量数据处理处理而言,仍是比较可观的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python 短路法提高二叉堆插入效率 的相关文章

  • 使用 Python 或 Django 处理收到的电子邮件?

    我了解如何通过 Django 发送电子邮件 但我希望用户能够回复电子邮件 如果他们发送 以及我收到 的电子邮件包含与某个字符串匹配的消息 我将调用一个函数 我已经做了一些谷歌搜索 但除了自己制作脚本之外似乎没有什么好的解决方案 如果有什么东
  • Python BS4 Scraper 仅返回每个页面的前 9 个结果

    我让这段代码按预期工作 只是它并没有完全按预期工作 一切似乎都很顺利 直到我检查了我的 csv 输出文件并注意到我每页只得到前 9 个结果 每页应该有 40 个结果 因此我得到的结果少于预期的 25 有什么想法吗 import reques
  • Django 是否使用一个线程来处理 WSGI 或 Gunicorn 中的多个请求?

    根据标题 我想知道 Django 在通过 WSGI 或 Gunicorn 运行时是否使用一个线程来处理多个请求 我知道从不应该访问的地方访问请求是一种不好的做法 但我仍然想这样做 我认为有充分的理由 例如在我的自定义模板加载器中访问当前用户
  • Python3 http.server:将日志保存到文件中

    我使用Python3 6编写了一个简单的HTTP服务器来重定向所有请求 我写的文件可以找到here https github com kmahyyg learn py3 blob master antiscanhttp py 我可以在 Ub
  • “初始化 MCI 时出现问题”播放声音问题

    我正在尝试使用 Playsound 播放代码文件夹中的文件 但是每次运行代码时 它似乎都能够调用该文件 但我总是收到以下输出 playsound PlaysoundException Error 277 for command open p
  • 动态添加jinja模板

    我有一个 jinja 模板 它是一组 div 标签内的唯一内容 div include temppage html div 当我按下按钮时 我想用其他内容替换标签之间的所有内容 我希望用另一个 jinja 模板 include realpa
  • QTextEdit.find() 在 Python 中不起作用

    演示问题的简单代码 usr bin env python import sys from PyQt4 QtCore import QObject SIGNAL from PyQt4 QtGui import QApplication QTe
  • Twython - 如何使用媒体 url 更新状态

    在我的应用程序中 我允许用户在 Twitter 上发帖 现在我想让他们通过媒体更新他们的状态 In twython py我看到一个方法update status with media从文件系统读取图像并上传到 Twitter 我的图像不在文
  • PyQt:如何设置组合框项目可检查?

    为了将 GUI 小部件数量保持在最低限度 我需要找到一种方法来为用户提供下拉菜单项的选择 这些菜单项可用于过滤掉 listWidget 项中显示的内容 假设 listWidget 列出了 5 个不同类别的项目 Cat A Cat B Cat
  • 如何使用Python在没有窗口的情况下在屏幕上显示文本

    问题 我需要在没有窗口的情况下直接将文本写入屏幕 文本需要显示在所有其他窗口和全屏应用程序之上 并且不应以任何方式单击或交互 Example The text doesn t need to have a transparent backg
  • Scrapy 仅抓取每个页面的第一个结果

    我目前正在尝试运行以下代码 但它只保留每个页面的第一个结果 知道可能是什么问题吗 from scrapy contrib spiders import CrawlSpider Rule from scrapy contrib linkext
  • python 中的子进程调用以使用 JAVA_OPTS 调用 java jar 文件

    示例代码 import subprocess subprocess call java jar temp jar 如何在上面的命令中指定JAVA OPTS 当我使用上述命令时 我收到 java lang OutOfMemoryError 无
  • 根据Python中两行之间的匹配创建一个带有[0,1]的新列

    我正在尝试将多个列表或数据帧与一个大型基础数据帧进行比较 然后对于任何匹配 我想附加一个存储 1 匹配或 0 不匹配的列 df pd DataFrame Name A B C D ID 5 6 6 7 8 9 7 list1 5 6 8 9
  • 如何在 Mac OS X 10.8 上安装 hg Convert 所需的 python subversion 绑定?

    我正在寻找一种解决方案 最好是干净且简单的 以启用hg convert使用 SVN 存储库在 OS X 10 8 上工作 目前 如果您尝试转换 SVN 存储库 您将得到一个could not load Subversion python b
  • 在 LINUX 上使用 Python 连接到 OLAP 多维数据集

    我知道如何在 Windows 上使用 Python 连接到 MS OLAP 多维数据集 嗯 至少有一种方法 通常我使用 win32py 包并调用 COM 对象进行连接 import win32com client connection wi
  • 如何从分组数据创建直方图

    我正在尝试根据 pandas 中的分组数据创建直方图 到目前为止 我已经能够创建标准线图 但我不知道如何做同样的事情来获取直方图 条形图 我想获得泰坦尼克号事故中幸存者和未幸存者的 2 个年龄直方图 看看年龄分布是否存在差异 来源数据 ht
  • 通过Python通过蓝牙发送消息或数据

    如何通过 python 通过蓝牙发送消息 而无需输入数字等密钥身份验证 我用过 pybluez 但我收到了这个错误 File send line 12 in
  • 如何编辑 QProgressBar 的样式表

    我无法在我的应用程序中编辑进度条的颜色 仅编辑文本颜色 pyhton 3 9 PySide6 QT Creator 7 0 2 Python应用程序 https i stack imgur com 6hKFI png import sys
  • 在python中打开带有重音符号的文本文件

    我尝试使用 Python 2 7 打开法语文本文件 我使用了命令 f open textfr r 但是当我使用 f read 我失去了重音字符 我明白了u J xc3 xa9tais xc3 xa0巴黎而不是J tais 巴黎等 当在lin
  • Python中矩阵元素的双重求和

    基于下面的简化示例 我想在我的代码中 from sympy import import numpy as np init printing x y symbols x y mat Matrix x 1 1 y X 1 2 3 Y 10 20

随机推荐

  • MySQL介绍,SQL入门及表结构分析

    数据库分类 关系型数据库 SQL 通过表与表之间 行与列之间的关系去存储数据 如MySQL Oracle 两者本质都是DBMS 数据库管理系统 非关系型数据库 No SQL意为Not only SQL 通过对象自身属性去存储 如Redis
  • git cherry-pick使用总结

    第一次在csdn发文章 还没找到节奏 请多多指教 这次给大家介绍一下Git中常用的cherry pick cherry pick的作用 将现有的某个提交应用到当前分支上 git cherry pick edit n m parent num
  • QComboBox类的使用,下拉列表框的触发:activated与currentIndexChanged的区别

    一 介绍 QcomboBox属于继承自QWidget 给用户提供一种呈现选项列表的方式 作用 使其占最小的控件 列举最多的选项供用户选择 二 触发条件 当前用户点击所选的具体列表项 两种触发方式 1 void currentIndexCha
  • Redis学习笔记五:redis主从复制

    通常使用redis时 如果redis存储的是一些非常重要的数据 那么只配置一台服务器的redis是有风险的 以为如果主服务器宕机 影响到正常业务之外 最终要的是数据的丢失 因此我们常常会配置多台redis做集群 除了防止主机宕机 我们还可以
  • 【AI视野·今日CV 计算机视觉论文速览 第166期】Mon, 28 Oct 2019

    AI视野 今日CS CV 计算机视觉论文速览 Mon 28 Oct 2019 Totally 47 papers 上期速览 更多精彩请移步主页 Interesting 联合显著性检测 提出了一种从单张图像中检测出具有相似语义属性的物体显著性
  • [转]一文看懂区块链架构设计 - 从概念到底层技术

    前言 区块链作为一种架构设计的实现 与基础语言或平台等差别较大 区块链是加密货币背后的技术 是当下与VR虚拟现实等比肩的热门技术之一 本身不是新技术 类似Ajax 可以说它是一种技术架构 所以我们从架构设计的角度谈谈区块链的技术实现 无论你
  • 广西人才网实习信息爬取与数据库存储实战

    广西人才网实习信息爬取与数据库存储实战 https www gxrc com 大家好 我是W 项目介绍 本项目为CrawlSpider结合MySQL MongoDB爬取求职网站信息的项目 目标是将网站指定分类下的招聘信息 包括 职位名称 公
  • Jupyter Notebook导入和删除虚拟环境

    在Jupyter Notebook中加载虚拟环境 比如现在我创建了一个虚拟环境名为pytorch 那么首先我先进入虚拟环境 activate pytorch Linux下需要使用source activate 然后运行 conda inst
  • Android init.rc整理

    AIL概述 init rc由AIL语言编写而成 可以参考system core init README md来学习AIL语法相关知识 不同Android版本关于AIL的说明存在一些细微差异 但基本语法和总的思路是不变的 往往我们可以先查看对
  • 2021哈工大机器翻译实验室经验贴(回忆版)

    哈工大机器翻译实验室 有两轮 一轮笔试 一轮面试 第一轮笔试题 根据本人的回忆 3道简答 5道编程题 60分钟 一 简答题 1 Windows下的软件Office 在Ubuntu环境下能否运行 说明理由 2 已知账户名和账户密码 说明登录到
  • 反射与线程间通讯

    反射 一 在运行状态中 对于任意一个类 都能够获取到这个类的所有属性和方法 对于任意一个对象 都能够调用它的任意一个方法和属性 包括私有的方法和属性 这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的反射机制 通俗点讲 通过
  • 设置linearlayout最大高度_数据中心:主要设备用房高度需求及建筑层高规划

    主要设备用房高度需求 数据中心主要设备用房为35KV开闭所 10KV开闭所 低压变配电房 动力 低压变配电房 IT UPS 柴油发电机组 冷冻机房 IT机房模块间等 35KV开闭所通常单独设置不在IT机房大楼内布置 本文不再讨论 各设备用房
  • Nginx服务优化

    配置nginx隐藏版本号 隐藏nginx版本号 避免安全漏洞泄漏 方法一 修改配置文件法 root www conf vim usr local nginx confnginx conf 17 http 18 include mime ty
  • 图解---散列表(hash表)的基本原理以及hash冲突(碰撞)--易懂版

    图解 散列表 hash表 的基本原理以及hash冲突 碰撞 易懂版 散列表为什么诞生 它用于做什么 先说说数组 数组的优点是查找比较快 但是添加和删除效率比较低 再说说链表 链表的优点是添加和删除效率比较快 相对于数组 但是遍历需要一个指针
  • 一种软件网络验证方式的实现 + 网络验证转本地验证的一种实现(附VC源码)...

    目前很多软件都是通过网络验证来实现的 一种比较流行的方式便是把服务器端 如验证网页 放在服务器上 软件为客户端 当软件注册或启动时通过网络与服务器端进行数据交换 重新实现验证的目的 个人觉得网络验证将是一种趋势 做得好的网络验证方式将是对软
  • Spring 源码 事件监听

    2019独角兽企业重金招聘Python工程师标准 gt gt gt spring 监听器 一 事件监听机制概述 二 事件监听机制结构 三 Spring监听机制架构 Spring的Application拥有发布事件并且注册事件监听器的能力 拥
  • python验证码识别MuggleOCR通用识别使用

    先来看看MuggleOCR简介 白嫖 这是一个为麻瓜设计的本地OCR模块 只需要简单几步操作即可拥有两大通用识别模块 让你在工作中畅通无阻 这套模型是基于 https github com kerlomz captcha trainer 训
  • JSP注释(4种)

    说到注释 相信大家肯定都不陌生 它是对程序代码的解释和说明 注释可以提高代码的可读性 让他人能够更加轻松地了解代码 从而提高团队合作开发的效率 在 JSP 中可以使用以下 4 种注释 HTML 注释 带有 JSP 表达式的注释 隐藏注释 脚
  • 登录和注册的基本实现,超简单!

    前序 相信有很多的人在刚刚做项目的实现 登录与注册功能的实现是基本的要求 要是刚刚开始写的小伙伴肯定会有很多的困惑 这里我介绍一下自己的写法 希望能帮到你 也希望能免费点个小 这里就以之前我写的一个为例 大家可以根据自己的规则来更改 一 登
  • python 短路法提高二叉堆插入效率

    在学习 problem solving with algorithms and data structure using python 中的二叉堆时 其插入数据方法是将这个数据放在列表的尾部 然后通过一次次与父节点进行比较 并且交换 实现顺