二叉堆对于优先级队列的优点?

2024-05-08

看来我错过了一些非常简单的东西:优先级队列的二进制堆与快速排序的值数组相比有什么优势?在这两种情况下,我们将值保存在数组中,插入的时间复杂度为 O(logN),删除最大的时间复杂度为 O(1)。在这两种情况下,给定元素数组的初始构造都是 O(NlogN),尽管链接http://en.wikipedia.org/wiki/Heap_%28data_struct%29 http://en.wikipedia.org/wiki/Heap_%28data_structure%29建议更快的弗洛伊德算法来构建二叉堆。但在队列的情况下,元素可能会被一个接一个地接收,因此这种优势就消失了。此外,合并对于二叉堆似乎表现更好。
那么除了合并之外,还有哪些原因选择BH呢?也许我的假设是错误的,BP仅用于研究目的。我检查了 C++ 文档,他们提到了“堆”,但当然它不一定意味着二进制堆。
有点类似的问题:什么时候使用堆作为优先级队列是一个坏主意? https://stackoverflow.com/questions/19025317/when-is-it-a-bad-idea-to-use-a-heap-for-a-priority-queue?rq=1


二叉堆的主要优点是,您可以在最初构建它之后有效地向其中添加新值。假设您想使用已排序的数组支持优先级队列。如果预先知道队列中的所有值,您可以对这些值进行排序,正如您所提到的。但是,当您想要向优先级队列添加新值时会发生什么?在最坏的情况下,这可能需要时间 θ(n),因为您必须向下移动所有数组元素,以便为刚刚添加的新元素腾出空间。另一方面,插入二叉堆需要时间 O(log n),速度呈指数级增长。

在排序数组上使用堆的另一个原因是,如果您只需要使一些元素出列。正如您提到的,对数组进行排序需要时间 O(n log n),但使用巧妙的算法,您可以在 O(n) 时间内构建堆。如果您需要构建一个优先级队列并从中保留 k 个元素,其中 k 事先未知,则排序数组的运行时间为 O(n log n + k),二叉堆的运行时间为 O(n + k log n )。对于较小的 k,第二种算法要快得多。

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

二叉堆对于优先级队列的优点? 的相关文章

  • 解释这段代码的工作原理;子进程如何返回值以及在哪里返回值?

    我不明白子进程如何返回该值以及返回给谁 输出为 6 7 问题来源 http www cs utexas edu mwalfish classes s11 cs372h hw sol1 html http www cs utexas edu
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • Linux内核container_of宏和C90中的通用容器

    是否有可能实施容器的 http lxr linux no linux tools perf util include linux kernel h L18纯C90中的宏 我不确定如何做到这一点 因为内核实现取决于海湾合作委员会黑客 http
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • C++ 实现堆中值函数

    根据此处找到的答案 https stackoverflow com a 10931091 1311773 https stackoverflow com a 10931091 1311773 我正在尝试实现两个堆 以便我可以计算运行中位数
  • 计算机如何评估巨大的数字?

    例如 如果我输入一个值 1234567 98787878 Wolfram Alpha 可以为我提供许多细节 这包括小数近似 总长度 最后一位数字等等 您如何评估如此大的数字 据我了解 编程语言必须具有特殊的数据类型才能存储数字 更不用说将其
  • 将结构体数组传递给函数 C++

    抱歉这个菜鸟问题我只是有点困惑 如果我在 main 中有一个结构数组 我想将其传递给函数 struct MyStruct int a int b char c mayarray 5 MyStruct StructArray 10 myFun
  • 沿着长数据序列在固定大小的移动窗口中查找中值

    给定一个数据序列 可能有重复项 一个固定大小的移动 窗口 从数据开始处每次迭代时移动窗口 序列 使得 1 从窗口中删除最旧的数据元素并添加新数据 元素被推入窗口 2 求每次移动时窗口内数据的中位数 以下帖子没有帮助 有效地找到随机序列的中值
  • Go的堆接口实现的优先级队列的大小限制

    在Java中 有一个具有大小属性 的PriorityQueue 我在这里也期待同样的事情 如果我没记错的话 用例 一一读取数百万数据并将其发送到优先级队列 我只想要前 5 个计算元素 因此我只想要大小为 5 的堆 优先级队列 我正在尝试使用
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • 给定一个数字 0-9 的数组和一个整数 n,找到可由输入数组组成且小于 n 的所有整数

    问题是这样的 给你一个数字 0 9 的数组和一个整数n 该数组可能包含任何给定数字的重复项 找到所有可以通过连接输入数组中的数字形成的整数并且小于n 输入数组中的数字可以在输出的元素中重复 例如 输入为 2 5 8 且 n 223 则输出应
  • 伊德里斯中的快速排序

    我正在学习 Idris 我想我会尝试为 Vect 类型实现快速排序 但我在使用实用方法时遇到了困难 该方法应该给定一个主元元素和一个向量 将向量分成两部分 一个元素的元素 主元 另一个元素的元素 gt 主元 这对于列表来说很简单 split
  • 我可以使用什么数据结构来查找给定姓名的人的电话号码?

    我可以使用什么数据结构来查找给定姓名的人的电话号码 假设您只会使用人名进行查询 那么最好的选择是使用关联数据结构 这基本上是一种数据结构 通常实现为哈希表或平衡二叉搜索树 将数据存储为键 gt 值 或者 换句话说 作为 键 值 对 您使用键
  • JAVA实现AVL树

    我想用Java实现一个AVL树 这是我到目前为止所拥有的 public class AVLNode private int size The size of the tree private int height The height of
  • 具有固定大小的 Java PriorityQueue

    我正在计算算法的大量可能的结果组合 为了对这些组合进行排序 我用双值对它们进行评级并将它们存储在 PriorityQueue 中 目前 该队列中有大约 200k 个项目 这非常占用内存 实际上 我只需要说出列表中所有项目中最好的 1000
  • 快速排序应用程序中这些交换代码行的目的是什么?

    我试图理解快速排序的实现或应用程序以找到第 k 个最小元素 这是我试图理解的代码 public int quicksort int a int start int end int k if start lt end int pivot pa
  • 有效地合并两个数组 - 一个已排序,另一个未排序

    我正在解决一个问题 该问题有一个由 n 个元素组成的排序数组 后跟一个未排序的长度数组 O logn O 平方 n 如何最有效地对整个列表进行排序 在上述两种情况下我应该使用哪种排序 由于将单个元素插入数组并保持其排序是O n 你不可能变得
  • Java:数组和向量

    我习惯于使用 PHP 但最近我一直在使用 Java 并且试图解决这个问题让我很头疼 我想用 Java 保存这个表示 Array col name 1 gt Array 1 gt col value 1 2 gt col value 2 n

随机推荐

  • 对齐坐标系

    Let s say I have 2 coordinate systems as it is shown in image attached 如何对齐这个坐标系 我知道我需要将第二个坐标系围绕 X 平移 180 度 然后将其平移到第一个坐标
  • 在Linux伪终端中执行从一个终端发送到另一个终端的字符串

    假设我有一个终端 其中 tty 的输出是 dev pts 2 我想从另一个终端向第一个终端发送命令并执行它 使用 echo ls gt dev pts 2 仅在第一个终端中打印 ls 有没有办法执行字符串 不 终端不执行命令 它们只是数据的
  • 从打字稿中的数组中删除对象

    如何从打字稿中的数组中删除对象 revenues drug id 20 quantity 10 drug id 30 quantity 1 所以我想从所有对象中删除 drug id 我怎样才能做到这一点 谢谢你 你可以用它 this rev
  • 禁止精度损失的整数转换

    如何防止此类代码被编译 include
  • 从 Django Rest Framework 中的 Json 字符串中删除反斜杠

    dct data json tour data dict tour data json dumps dct data 如何删除这些反斜杠json 这是我的输出 strFileOpenDateAjxKey 2018 01 16 12 40 2
  • 错误:环境 /Users/myuser/.virtualenvs/iron 不包含激活脚本

    我正在 macOS Catalina 版本 10 15 1 上运行 python 3 7 6 并且我正在尝试安装和设置virtualenvwrapper我已经安装了pip3 install virtualenvwrapper 我的 bash
  • asp classic 登录时获取用户IP

    我们有员工考勤制度 它是用 asp classic 编写的 带有 MS ACCESS 数据库 其中存储用户信息及其登录时间 我想添加一件额外的事情 我可以从用户登录的地方看到他们的工作站 IP 地址 我们相信 即使某人不在办公室 某人也会替
  • Mootools 使用“extend”方法扩展“Function”类,导致 jQuery 无法使用

    Mootools 扩展了 Function 类 并在其中添加了一个名为 extend 的新方法 现在 jQuery 尝试使用 jQuery prototype extend 添加 扩展 功能 然而 由于 extend 已经是 jQuery
  • Scala 中的类型类解析如何工作?

    我有一个带有类型参数的函数 我想知道该类型参数是否是一个Option或不 我读过一些博文 即this one http danielwestheide com blog 2013 02 06 the neophytes guide to s
  • (可选)根据运行时值序列化属性

    从根本上讲 我想根据序列化时的值包含或省略生成的 Json 中的属性 更具体地说 我有一个类型 它知道是否已为其分配了值 并且我只想序列化该类型的属性 如果有 has是分配给它的东西 所以我需要在运行时检查该值 我试图让我的 API 更容易
  • JPA:运行时如何指定类对应的表名?

    注意 我对 Java 非常熟悉 但对 Hibernate 或 JPA 还不太熟悉 还没有 我想编写一个通过 JPA 与 DB2 400 数据库通信的应用程序 现在我可以获取表中的所有条目并将它们列出到 System out 使用 MyEcl
  • 从设备坐标系到绝对坐标系的加速度

    从我的 Android 设备中 我可以读取线性加速度值数组 在设备的坐标系中 和绝对方向值数组 在地球坐标系中 我需要的是获得后一个坐标中的线性加速度值 系统 我怎样才能转换它们 EDIT阿里在评论中回复后 好吧 如果我理解正确的话 当我测
  • 如何使字形更大? (改变尺寸?)

    我想让地球字形更大 以便它覆盖页面的很大一部分 它是矢量图像 它不是在按钮或任何东西中 而是在按钮中 它只是孤独的 有没有办法做到这一点 div class jumbotron span class glyphicon glyphicon
  • Laravel 如何使用查询生成器返回单列值

    我想使用 SQL 查询中的数据 为了进一步解释它 这里是我的代码 myquery DB table attendances gt select user id gt where date only newdate gt orderBy lo
  • 通过 Websockets 进行 WebRTC 视频聊天

    我正在尝试使用 webRTC 和 WebSockets 进行信号发送来开发视频聊天应用程序 我的问题是 我不知道创建 RTCPeerConnection 并通过 webSocket 连接两个对等点 2 个浏览器 的过程是什么 至少在本地 我
  • 使用 .NET Core 2.2 发送电子邮件

    在 MVC ASP NET 中 您可以在 web config 文件中设置 smtp 配置 如下所示
  • Razor 视图的有界属性在发布后未更新

    我无法在下面的示例剃刀视图中获取属性价格以进行更新OnPostOrder 执行 我编写此示例视图是为了执行以下操作 在更改产品选择列表时 使用 jquery 提交 ProductFormsubmit Use asp page handler
  • 如何使用 Python 'in' 运算符检查我的列表/元组是否包含每个整数 0、1、2?

    我如何使用Pythonin运算符检查我的列表 元组sltn包含整数 0 1 和 2 我尝试了以下方法 为什么它们都错了 Approach 1 if 0 1 2 in sltn kwd1 True Approach 2 if any item
  • 图钉的 OnClickListener

    在这里我使用了谷歌地图和叠加层 我使用了图钉图像来指向 GeoPoint 我想设置一个OnClickListener图钉事件 当用户触摸 pin 时 我想吐槽一条消息 下面是代码 import java util List import c
  • 二叉堆对于优先级队列的优点?

    看来我错过了一些非常简单的东西 优先级队列的二进制堆与快速排序的值数组相比有什么优势 在这两种情况下 我们将值保存在数组中 插入的时间复杂度为 O logN 删除最大的时间复杂度为 O 1 在这两种情况下 给定元素数组的初始构造都是 O N