为什么在堆排序中使用平面列表?

2024-01-01

In heapsort,数据存储在称为“heap”。我见过的几乎所有实现都使用平面列表对于数据结构。

有人可以向我解释这是为什么吗?

为什么不使用嵌套数组 or an 二叉树的实例?显式不是比隐式更好吗?

是因为遍历结构等实现困难,还是其他原因?


如果您想了解如何在 Python 中实现堆排序,那么标准库模块就是您的最佳选择heapq。 Python 有堆排序的 C 和 Python 实现heapq模块定义了 Python 模块,然后用 C 模块覆盖它们(如果可用)。这意味着您可以阅读和理解 Python 实现,但如果您实际使用它,则可以获得 C 版本的好处。

最后给出了使用该模块的快速示例:

heap = []
data = [1, 3, 5, 7, 9, 2, 4, 6, 8, 0]
for item in data:
    heappush(heap, item)
sort = []
while heap:
    sort.append(heappop(heap))
print sort

堆由部分排序的列表表示,该列表具有这样的约束:对于列表中索引 n 处的每个元素,该关系成立heap[n] <= heap[n*2+1] and heap[n] <= heap[n*2+2](忽略不存在的元素)。这是一种将二叉树折叠为简单列表以便于存储的简单方法。

heappush()将一个新元素放入列表中以保持不变性,heappop()删除最小的元素。heapify(somelist)就地重新排序列表以满足不变量。

当您只想对列表的一部分进行排序(给我最小的 k 个项目),或者您想在不断接收进入列表的新项目的同时处理最小的项目时,堆排序非常有用。后者的一个很好的例子是操作系统任务调度程序,您可以在其中按优先级顺序保留一堆可运行线程,并且每当您需要调度线程运行时,都可以快速从堆中弹出最高优先级的可运行线程。

Edit:有几个原因可以解释为什么列表/数组比显式树结构更适合堆存储。最明显的是,显式树具有更大的内存开销(涉及每个对象内的指针或为堆中的每个对象分配一个单独的对象),并且当对象在堆内移动时速度也会变慢更新指向孩子和可能的父母的多个指针。

不太明显的是,您需要能够轻松获取最后一个元素,这在列表中很容易,但这意味着您还需要存储和更新每个元素上的同级指针。您需要能够轻松获取最后一个元素的原因是,要添加一个元素,请将其设为最后一个元素,然后相对于其父元素和同级元素对其重新排序(O(log n) 操作)或删除最小的,您只需将当前的最后一个元素放在其位置并向下重新排序。如果您没有 O(1) 访问树的最后一个元素的权限,那么这两个操作都会对性能造成严重影响。

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

为什么在堆排序中使用平面列表? 的相关文章

  • 从一种数字系统转换为另一种数字系统后会有多少位数字

    主要问题 有多少位数字 让我解释 我有一个二进制数 11000000 十进制数是192 转换为十进制后 它有多少位 以十进制表示 在我的示例中 它是 3 位数字 但是 这不是问题 我在互联网上搜索并找到了一种用于整数部分的算法和一种用于小数
  • 在Python中如何获取字典的部分视图?

    是否有可能获得部分视图dict在Python中类似于pandasdf tail df head 说你有很长一段时间dict 而您只想检查某些元素 开头 结尾等 dict 就像是 dict head 3 To see the first 3
  • 无故运行测试时 PyCharm 抛出“AttributeError: 'module' object has no attribute”

    因此 我有一个 Django REST Framework 项目 有一天它无法在 PyCharm 中运行测试 从命令行我可以使用它们来运行它们paver or the manage py直接地 曾经有一段时间 当我们没有在文件顶部导入类的超
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • Python tkinter.filedialog Askfolder 干扰 clr

    我主要在 Spyder 中工作 构建需要弹出文件夹或文件浏览窗口的脚本 下面的代码在spyder中完美运行 在 Pycharm 中 askopenfilename工作良好 同时askdirectory什么都不做 卡住了 但是 如果在调试模式
  • Python中列表中两个连续元素的平均值

    我有一个偶数个浮点数的列表 2 34 3 45 4 56 1 23 2 34 7 89 我的任务是计算 1 和 2 个元素 3 和 4 5 和 6 等元素的平均值 在 Python 中执行此操作的快捷方法是什么 data 2 34 3 45
  • 如何根据 HTTP 请求使用 Python 和 Flask 执行 shell 命令并流输出?

    下列的这个帖子 https stackoverflow com questions 15092961 how to continuously display python output in a webpage 我能够tail f网页的日志
  • Pandas:如何将数据框插入 Clickhouse

    我正在尝试将 Pandas 数据框插入 Clickhouse 这是我的代码 import pandas import sqlalchemy as sa uri clickhouse default localhost default ch
  • 设置 verify_certs=False 但 elasticsearch.Elasticsearch 因证书验证失败而引发 SSL 错误

    self host KibanaProxy 自我端口 443 self user 测试 self password 测试 我需要禁止证书验证 使用选项时它与curl一起使用 k在命令行上 但是 在使用 Elasticsearch pytho
  • 揭秘sharedctypes性能

    在 python 中 可以在多个进程之间共享 ctypes 对象 然而我注意到分配这些对象似乎非常昂贵 考虑以下代码 from multiprocessing import sharedctypes as sct import ctypes
  • 如何使用 Bokeh 动态隐藏字形和图例项

    我正在尝试在散景中实现复选框 其中每个复选框应显示 隐藏与其关联的行 我知道可以通过图例来实现这一点 但我希望这种效果同时在两个图中发生 此外 图例也应该更新 在下面的示例中 出现了复选框 但不执行任何操作 我显然不明白如何更新用作源的数据
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • 使用 NLP 进行地址分割

    我目前正在开发一个项目 该项目应识别地址的每个部分 例如来自 str Jack London 121 Corvallis ARAD ap 1603 973130 输出应如下所示 street name Jack London no 121
  • PIL - 需要抖动,但限制调色板会导致问题

    我是 Python 新手 正在尝试使用 PIL 来执行 Arduino 项目所需的解析任务 这个问题涉及到Image convert 方法以及调色板 抖动等选项 我有一些硬件能够一次仅显示 16 种颜色的图像 但它们可以指定为 RGB 三元
  • 字符串列表,获取n个元素的公共子串,Python

    我的问题可能类似于this https stackoverflow com questions 37514193 count the number of occurrences of n length not given string in
  • 从列表python的单个列表中删除子列表

    我已经经历过从列表列表中删除子列表 https stackoverflow com questions 47209786 removing sublists from a list of lists 但当我为我的数据集扩展它时 它不适用于我
  • 计算互相关函数?

    In R 我在用ccf or acf计算成对互相关函数 以便我可以找出哪个移位给我带来最大值 从它的外观来看 R给我一个标准化的值序列 Python 的 scipy 中是否有类似的东西 或者我应该使用fft模块 目前 我正在这样做 xcor
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0

随机推荐

  • Three.js 具有恒定大小的对象

    我正在开发一个绘图程序 我需要的是一个具有恒定大小的 THREE Object3D 元素 就像线条始终为 1px 一样 换句话说 我试图在舞台上放置一个对于观看者来说尺寸始终相同的对象 所以如果你靠近它 它的大小不会改变 类似的机制是三线
  • 以下 Fortran“并发”循环有效吗?

    我不认为下面的do concurrentFortran 循环有效 如下所示acc在每次迭代中都会被修改 但是 gfortran 没有给我任何类型的警告 并且结果值acc正确的是 55 它是否有效 integer acc i acc 0 do
  • 使用 JavaScript 提取 EXIF 数据

    我正在评估使用 Canvas 的移动网络应用程序的图像上传技术 症结在于客户端读取 EXIF 数据 本网站的其他讨论 https stackoverflow com questions 7584794 accessing jpeg exif
  • InnoDB SELECT ... FOR UPDATE 语句锁定表中的所有行

    MySQL 服务器版本 5 1 41 启用了 InnoDB 插件 我有以下三个发票表 invoices invoice components 和invoice expenses 表发票有invoice id 主键 发票 组件和发票 费用都链
  • phonegap android ajax请求适用于GET但不适用于POST

    在我的phonegapp ed android应用程序中发送以下请求适用于GET 但不适用于POST 有了 GET 一切就正常了 使用 POST 请求会通过 但 POST 变量 服务器端未通过 服务器返回 json 响应显示 未提供参数 P
  • 我可以将 HashSet 作为 HashMap 中的键吗?如果没有,请提出替代方案

    编辑 现在正确解释了问题 我有一个哈希图 我想在其中存储一起看到的单词集 键 以及它们一起看到的行 值 这是我想出的结构 HashMap
  • PHPUnit 和 MySQL 截断错误

    我对 PHPUnit 始终运行的行为感到头疼TRUNCATE在插入夹具之前without首先设置外键检查 Syntax error or access violation 1701 Cannot truncate a table refer
  • 为 CI 预装依赖项的 Docker 镜像

    常见建议 example https blog sparksuite com 7 ways to speed up gitlab ci cd times 29f60aab69f9 执行 CI 的方法是使用预装依赖项的镜像 不幸的是 对于像我
  • 从可变产品的 WooCommerce 变体中获取权重值

    我正在开发一个自动调整产品价格的插件 我所有的产品都是可变产品 这使得这个问题比我能解决的更困难 if product gt is type variable foreach product gt get available variati
  • SQL Server Management Studio 显示数据库图表 (ER) 权限

    我想知道是否有人确切地知道 SQL Server 2005 中的数据库需要哪些权限 以便当人们使用 SQL Server Management Studio 时 他们至少能够看到数据库图表 我尝试为该人提供 db datareader db
  • 为什么我的异常被捕获后仍然抛出?

    我有以下代码 其中使用函数调用的结果初始化变量 这个函数抛出异常 所以我设置了一个 try catch 来捕获异常 由于某种原因 即使 catch 子句运行后 异常仍然显示在屏幕上 include
  • 如何在Java Servlet中使用Session?

    我的 java 代码中的会话有问题 通过 post 提交表单后 java servlet 将确定验证码是否正确 我可以知道应该添加什么才能在 java servlet 中使用会话吗 我需要导入什么东西才能使用会话吗 protected vo
  • 在浏览器中编译sass文件

    我正在尝试为我的用户创建一个系统 他们可以在其中选择他们想要包含在项目中的特定 SCSS 文件 他们通过浏览器来完成此操作 一旦他们检查了所有相关的 SCSS 文件 他们就会想要点击基于浏览器的 编译 按钮来生成最终的 CSS 这可能吗 我
  • CSS 平台特定的 hack

    我想知道是否有一种方法可以使用 CSS 来定位平台 即不同的操作系统 Windows 7 Windows 8 Linux 等 我有一个样式表 带有 ul 列表和边框底部设置 当鼠标悬停在菜单元素上时会改变颜色 问题是 在 Windows 7
  • 使用下拉菜单外键保存表单集:IntegrityError XXX_id 可能不为 NULL

    我试图拥有一个表单集 其中每个表单 PropertySelector 都有一个下拉菜单 PropertySelector property 而该菜单的每个项目都是对另一个模型 Property 的ForeignKey引用 不知何故 当我尝试
  • 将RGB图像转换为灰度图像,减少java中的内存

    我有一个 RGB bufferedImage bImg 我想将 bImg 转换为灰度图像 BufferedImage grayIm new BufferedImage bImg getWidth null bImg getHeight nu
  • 在 Windows 窗体中获取多个 UI 线程

    我正在尝试找出一种方法让用户控件在自己的 UI 线程中运行 这可能吗 我试图防止基于模块的应用程序因单个模块而崩溃 有什么想法吗 那是不可能的 但是 通过一些重要的代码 您可以让不同的窗口在单独的线程中运行 每个窗口都有自己的消息循环 Up
  • sqlite SELECT 在查询列中是否存在与该列同名的值时返回所有记录

    sqlite3 test db SQLite version 3 6 21 Enter help for instructions Enter SQL statements terminated with a sqlite gt CREAT
  • ReferenceError:角度通用应用程序中未定义 IDBIndex

    我正在使用 ngserve 运行该应用程序 它运行良好 但是在我使用 npm run build ssr 构建应用程序后 应用程序构建成功 构建并运行 Angular 7 通用应用程序后 我在 dist 文件夹中收到这些错误 home tr
  • 为什么在堆排序中使用平面列表?

    In heapsort 数据存储在称为 heap 我见过的几乎所有实现都使用平面列表对于数据结构 有人可以向我解释这是为什么吗 为什么不使用嵌套数组 or an 二叉树的实例 显式不是比隐式更好吗 是因为遍历结构等实现困难 还是其他原因 如