Python 中内置最大堆 API

2024-02-12

默认 heapq 是最小队列实现,想知道是否有最大队列的选项?谢谢。

我尝试使用 _heapify_max 作为最大堆的解决方案,但如何动态处理推送/弹出元素?看来 _heapify_max 只能在初始化时使用。

import heapq

def heapsort(iterable):
    h = []
    for value in iterable:
        heapq.heappush(h, value)
    return [heapq.heappop(h) for i in range(len(h))]

if __name__ == "__main__":

    print heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])

编辑,尝试过 _heapify_max 似乎不适用于动态推送/弹出元素。我尝试了两种方法输出相同,两种输出都是[0,1,2,3,4,5,6,7,8,9]。

def heapsort(iterable):
    h = []
    for value in iterable:
        heapq.heappush(h, value)
    return [heapq.heappop(h) for i in range(len(h))]

def heapsort2(iterable):
    h = []
    heapq._heapify_max(h)
    for value in iterable:
        heapq.heappush(h, value)
    return [heapq.heappop(h) for i in range(len(h))]

if __name__ == "__main__":

    print heapsort([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])
    print heapsort2([1, 3, 5, 7, 9, 2, 4, 6, 8, 0])

提前致谢, 林


过去我只是简单地使用过分类容器 https://pypi.python.org/pypi/sortedcontainers's SortedList为此,如:

> a = SortedList()
> a.add(3)
> a.add(2)
> a.add(1)
> a.pop()
3

它不是堆,但速度很快并且可以直接按要求工作。

如果你绝对需要它成为一个堆,你可以创建一个通用否定类来保存你的项目。

class Neg():
    def __init__(self, x):
        self.x = x

    def __cmp__(self, other):
        return -cmp(self.x, other.x)

def maxheappush(heap, item):
    heapq.heappush(heap, Neg(item))

def maxheappop(heap):
    return heapq.heappop(heap).x

但这会使用更多的内存。

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

Python 中内置最大堆 API 的相关文章

  • Python:我可以修改元组吗?

    我有一个 2 D 元组 实际上我以为 它是一个列表 但错误说它是一个元组 但无论如何 该元组的形式为 浮点数 val prod id 现在我有一个字典 其中包含 key gt prod id 和 value prod name 现在 我想将
  • 为什么 Dash 在上传文件时会出现解析错误?

    上传 Excel 或 CSV 会导致错误 我遵循了 Dash 演示 但是当我尝试扩展它来执行绘图之类的操作时 它就不起作用了 我不想只显示一张桌子 Dash Table 函数已更新 因此之前使用 Dash Table Experiments
  • 如何将当前日期分配给 odoo v8 中的日期字段?

    我想将当前日期分配给以下代码中的日期字段 start date calendar obj create cr uid name rec res act ion user id rec res asgnd to id start date l
  • PyKCS11 不可哈希列表

    我的 python 脚本旨在获取特定 so 库中插槽 令牌的详细信息 输出如下所示 Library manufacturerID Safenet Inc Available Slots 4 Slot no 0 slotDescription
  • 为什么通过selenium切换到alert不稳定?

    为什么通过selenium切换到alert不稳定 例如 1 运行代码 一切顺利 一切都很顺利 但如果这段代码在几分钟内运行 那么可能会出现错误 例如 没有可以单击的元素 等等 2 在一个站点上有一个警报窗口 alert driver swi
  • 在用户提交的正则表达式中查找捕获组

    我有一个 python 应用程序 需要处理用户提交的正则表达式 出于性能考虑 我想禁止捕获组和反向引用 我的想法是使用另一个正则表达式来验证用户提交的正则表达式不包含任何命名或未命名的组捕获 如下所示 def validate user r
  • 模拟导入失败

    我该如何制作import pkg失败moduleA py 我可以打补丁pkg如果从中导入某些内容则会失败 否则不会失败 test py import os import moduleA from unittest mock import p
  • OpenCV 在使用 anaconda 的 Linux 上无法与 python 正常工作。收到 cv2.imshow() 未实现的错误

    这就是我得到的确切错误 我的操作系统是 Ubuntu 16 10 OpenCV 错误 未指定错误 该功能未实现 使用 Windows GTK 2 x 或 Carbon 支持重新构建库 如果您使用的是 Ubuntu 或 Debian 请安装
  • 以有效的方式找到最近点

    我在 2d 平面上有一个点 例如 x0 y0 和一组 n 点 x1 y1 xn yn 我想在 a 中找到距离 x0 y0 最近的点比尝试所有要点要好得多 有什么解决办法吗 我还应该说我的观点是这样排序的 bool less point a
  • 不分配内存的重复排列

    我正在寻找一种算法来生成列表中重复 4 个元素 长度 2 1000 的所有排列 Java实现 http en literateprograms org Permutations with repetition 28Java 29 问题是上面
  • 在 Django 1.9 中使用信号

    在 Django 1 8 中 我能够使用信号执行以下操作 一切顺利 init py from signals import 信号 py receiver pre save sender Comment def process hashtag
  • 有没有更快的方法将数字转换为名称?

    以下代码定义了映射到数字的名称序列 它的设计目的是获取一个号码并检索一个特定的名称 该类通过确保名称存在于其缓存中来进行操作 然后通过索引到其缓存中来返回名称 问题在这 如何在不存储缓存的情况下根据数字计算出名称 该名称可以被认为是一个以
  • Python Peeweeexecute_sql() 示例

    我使用 Peewee 模块作为我的项目的 ORM 我看了整个文档 没有明确的 有关如何处理 db execute sql 结果的示例 我跟踪代码 只能发现db execute sql 返回游标 有谁知道如何处理光标 例如迭代它并获取 返回复
  • 了解 Tensorflow 中的 while 循环

    我正在使用用于 Tensorflow 的 Python API https www tensorflow org api docs python 我正在努力实施罗森布罗克函数 https www sfu ca ssurjano rosen
  • 为什么这个记忆器适用于递归函数?

    我不明白为什么下面的代码是这样的fib以线性而非指数时间运行 def memoize obj Memoization decorator from PythonDecoratorLibrary Ignores kwargs cache ob
  • 如何通过pygit2获取当前签出的Git分支名称?

    这个问题应该与 如何获取Git中当前的分支名称 https stackoverflow com questions 6245570 how to get current branch name in git 获取 git 当前分支 标签名称
  • 嵌套 for 循环以列出具有不同“if”条件的理解

    我正在尝试将此嵌套循环转换为列表理解 但我不确定是否可能 因为 tmp 列表中的项目可能有不同的值 这是最好的方法吗 谢谢 final for a in range 13 1 for b in range 0 4 for c in rang
  • python字符串包含双引号字符

    我的输入字符串由字符组成 包括双引号和单引号 和 B SS JU PQ AD DDSFD ABD E J 但是 当我从文本文件打开上述输入并打印它时 第三行中的双引号 被打印为 xe2 x80 x9d 我的目标是进行简单的字符计数 B 2
  • 如何加速Python循环

    我查看了几个网站上的一些讨论 但没有一个给我解决方案 这段代码运行时间超过5秒 for i in xrange 100000000 pass 我正在研究整数优化问题 我必须使用O n log n 算法编辑 O n 4 算法 其中n代表矩阵的
  • 安装 confluence-kafka 时“文件名或扩展名太长”?

    我在使用 pip install confluence kafka 安装 confluence kafka 时遇到一些问题 但我收到此错误 文件名或扩展名太长 详细信息如下 Collecting confluent kafka Using

随机推荐

  • PHP 中的位操作和 MySQL 检索

    我正在尝试稍微优化我的 mysql 表 以获得一个更易于管理的表 我想将用户权限存储在一个位字段中 例如 用户权限可以是 0110 我的用户权限数量越来越多 因此长度可能会长一点 该示例可能对应于以下内容 0 用户不能在网站上发布新闻 1
  • Groovy 中的爬虫(JSoup VS Crawler4j)

    我希望在 Groovy 中开发一个网络爬虫 使用 Grails 框架和 MongoDB 数据库 它能够爬取网站 创建网站 URL 及其资源类型 内容 响应时间和涉及的重定向数量的列表 我正在争论 JSoup 与 Crawler4j 我已经阅
  • HTML5 日期输入 6 位数年份

    我有一个标准
  • 设置 QMessageBox 的父级

    我不明白设置父级有什么好处QMessageBox 例如在以下代码中 void mainWindow showMessage QString msg QMesageBox information this title msg this is
  • 如何创建批处理文件来在Cmder中执行命令?

    我想创建一个启动 Cmder 的批处理文件 然后在 Cmder 中执行一些命令 我知道如何使用批处理文件启动 Cmder 但不知道如何使用批处理文件在 Cmder 中编写 执行命令 我尝试这个 echo off cd C Program F
  • 将 html 内联图像从浏览器复制/粘贴到文字处理器

    我正在尝试使用 html 内联图像 背景 尝试创建我自己的 CMS 它不会将图像保留为单独的文件 我可以将此类图像从浏览器 Firefox IE 复制 粘贴到 Photoshop 或 MS Paint 等图像处理程序 但不能复制到 MS W
  • 使用 svn+ssh 协议通过 2 跳访问 Subversion 存储库

    我的 Ubuntu Subversion 服务器无法直接访问互联网 192 168 1 2 我的公共 Ubuntu 机器通过 DMZ 暴露在 192 168 1 1 我已经设置了从 192 168 1 1 3906 到 192 168 1
  • C 中的“double”运算和优化

    我最近分析了一段用 VS2005 编译的旧代码 因为 调试 无优化 和 发布 O2 Oi Ot 选项 编译中的数值行为不同 简化的 代码如下所示 void f double x1 double y1 double x2 double y2
  • YII 2.0 GridView 更新

    我在通过 javascript 更新 yiigridview 时遇到问题 我正在尝试以 yii 1 1 方式使用它 jQuery fn yiigridview update grid id 但这给我带来了错误 undefined is no
  • 管道阶段规范对象必须恰好包含一个带有 php mongo 聚合的字段

    我正在尝试将聚合与项目 匹配和排序一起使用 但出现异常 MongoResultException准确地说 说 exception A pipeline stage specification object must contain exac
  • php oop 从同一类的方法内部调用方法

    我有以下问题 class class name function b do something function c function a call function b 当我像往常一样调用函数时 this gt b 我收到此错误 Usin
  • 如何避免页面刷新时的按钮事件

    我有 aspx 页面 该页面通过单击按钮将数据插入数据库 但当我按下按钮时 它就正常了 我收到 成功插入数据 的成功消息 在这种情况下 如果我按 F5 或刷新页面 它将触发按钮单击事件 为什么应该是这样 如何避免这种情况 When the
  • 如何在Python中检查字符串是否只包含数字或“/”?

    我正在尝试检查字符串是否仅包含数字或 以用作验证形式 但是我找不到同时执行这两项操作的方法 自动取款机我有这个 if variable isdigit False 这适用于数字 但我还没有找到一种方法来检查斜杠 有很多选项 如此处所示 列表
  • 通过 unixODBC 和 FreeTDS 从 MSSQL 返回西里尔字母的问题

    我在远程主机上的 Ubuntu 12 04 LTS 和 MSSQL 2008 上使用 django pyodbc 作为数据库后端 除了返回西里尔字母符号外 它的效果很好 我看到的不是它们 而是问号 我已经开始调查可能导致此问题的原因 据我了
  • java打印阶乘计算过程

    您好 我需要打印阶乘计算过程 例如 如果用户输入的是5 系统应该打印出 5 4 3 2 1 120 我有这个代码 public static void factorial Scanner sc new Scanner System in i
  • 带有绿色复选标记的控制台消息 JavaScript

    我想知道控制台中是否有可能有一个绿色复选标记 就像 console warn 有黄色警告标志 console error 有红色错误标志一样 我在网上搜索过是否有类似的功能 但没有找到 现在我正在寻找一种方法将图标放在console log
  • 为什么在计时器回调中调用事件会导致以下代码被忽略?

    我正在编写一个简单的游戏 使用来自system threading命名空间来模拟操作的等待时间 我的目标是让计时器每秒执行一次 持续 x 秒 为了实现这一点 我在计时器回调中添加了一个计数器 问题是我在调用后放置的任何代码DeliveryP
  • 从 testNG 测试中检索 @Test 描述

    我的 testNG 测试有以下格式 Test alwaysRun true dependsOnMethods testStep 1 description Enter the names and verify that they are a
  • 如何在不循环的情况下一次为多个数组索引赋值?

    如何在 C 中为数组的多个元素设置一个值 Example 我有一个数组初始化如下 int array new int 2 3 5 3 7 2 9 我想将第二个和第五个索引之间的值设置为 8 怎样才能做到呢 好吧 如果你想变得可爱 你可以创建
  • Python 中内置最大堆 API

    默认 heapq 是最小队列实现 想知道是否有最大队列的选项 谢谢 我尝试使用 heapify max 作为最大堆的解决方案 但如何动态处理推送 弹出元素 看来 heapify max 只能在初始化时使用 import heapq def