使用堆属性按排序顺序打印树 (Cormen)

2024-05-02

我对算法理论(来自 Cormen)感到耳目一新。
二进制尝试一章中有一个练习,要求:

min-heap 属性可以用来打印 n 节点的键吗 树在 O(n) 时间内排序?展示如何做,或解释为什么不做。

我想是的,这是可能的。
在最小堆中,节点中的元素小于其两个子节点。
所以堆的根总是所有n个元素中较小的元素,根的左孩子比左子树中的所有元素小,根的右孩子比左子树中的所有元素小。右子树等

因此,如果继续提取根,打印它,然后用其较小的子项更新根,我们将保留最小堆属性并按排序顺序打印。 (我正在考虑一个不基于数组的最小堆)。

因此,这可以在 O(n) 时间内完成,因为要更新根,我们只需比较 2 个子节点并将根的指针更新为 2 个中较小的一个。

但我在解决方案中检查了这里:
Cormen 补充解决方案 http://mitpress.mit.edu/algorithms/solutions/chap12-solutions.pdf

1)它讨论了最大堆 2)它说它不能在 O(n) 时间内完成:

在堆中,节点的键是其子节点的键。在二进制中 搜索树,节点的键是其左孩子的键,但其右孩子的键 孩子的钥匙。堆属性,与二叉树不同 属性,无助于按排序顺序打印节点,因为它 不知道节点的哪个子树包含要打印的元素 在该节点之前。堆中,小于节点的最大元素 可以在任一子树中。请注意,如果堆属性可以是 用于在 O(n) 时间内按排序顺序打印键,我们将得到一个 用于排序的 O(n) 时间算法,因为构建堆只需要 准时。但我们知道(第 8 章)比较排序必须采用 (nlgn) 时间。

从我的角度来看,我可以理解使用最大堆,不可能在 O(n) 中打印它们。
但出于我解释的原因,是否可以使用 min-heap 属性来做到这一点?
另外为什么解决方案忽略最小堆。是拼写错误还是错误?

我在这里误解了什么吗?


首先,讨论中省略最小堆可能不是一个错字,我们讨论的是最小堆还是最大堆并不重要(比较器只是相反)。

仅提取根然后用其两个子树中较小的一个替换的问题是,不能保证左子树小于右子树中的所有节点(反之亦然)。考虑以下堆

        1
       / \
      4   6
     /\   /\
    5  8 9  7

打印后1你必须重新堆放,也就是说你提取1并将其替换为最后一行中的最后一个元素,在本例中7。然后,只要需要将堆返回到正确的状态,就可以进行切换

take away root and last node to root
        7
       / \
      4   6
     /\   /
    5  8 9

swap
        4
       / \
      7   6
     /\   /
    5  8 9

swap
        4
       / \
      5   6
     /\   /
    7  8 9

所有这些交换都会花费你log n time.

如果您将根节点替换为4,您仍然需要通过左分支来重新堆化结构,从而增加提取根节点的线性成本。如果堆看起来像这样怎么办

        1
       / \
      4   9
     /\   /\
    5  6 11 15
   /\
  8  7

我查看的形成解决方案的页面

1) 维基百科:二叉堆 http://en.wikipedia.org/wiki/Binary_heap

2) Wolfram MathWorld:堆 http://mathworld.wolfram.com/Heap.html这里的堆对于理解为什么它不是线性操作特别有帮助。

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

使用堆属性按排序顺序打印树 (Cormen) 的相关文章

  • Python:for 循环 - for i in range(0,len(list) 与 for i in list

    这是一个非常简单的Python 力学问题 为什么我不能只说 for i in range original list 而不是 for i in range 0 len original list 人们通常使用范围而不是前者吗 谢谢 If I
  • 基数首先排序最重要的还是最不重要的,哪个更快?

    我一直在研究基数排序实现 到目前为止粘贴在下面的代码 代码是用 Java 编写的 但在 C C 中应该也能正常工作 正如您从实现中看到的 我首先执行最高有效位 即整数的第 31 位 这似乎更快 因为一旦子组完成 就不再需要迭代 例如 打个比
  • 为什么我的 Project Euler Problem 12 算法这么慢?

    我已经在 Scala 中为 PE P12 创建了解决方案 但速度非常非常慢 有人可以告诉我为什么吗 如何优化这个 calculateDevisors 简单的方法和calculateNumberOfDivisors 除数函数具有相同的速度 i
  • Python 中的空填字游戏求解器

    我得到了一个包含填字游戏蓝图的矩阵 当然 它是空的 我们的目标是填补整个难题 这是 Checkio 的一项任务 我已经为此奋斗了相当长一段时间 根据我对复杂性的理解 这个问题没有完美的算法 不过 必须有最好的方法来做到这一点 对吧 我尝试了
  • 为什么在 MySQL 中计算带条件的行时需要“OR NULL”

    有一个关于 MySQL 的 COUNT 聚合函数的问题时不时地出现在我的脑海中 我想得到一些解释为什么它会这样工作 当我开始使用 MySQL 时 我很快了解到它的 COUNT condition 似乎只有在条件最后还包含 OR NULL 时
  • 如何在单向链表(一次遍历中)中从尾部获取第 n 个节点?

    所以我在一次考试中得到了这个问题 如何从单链表的尾部获取第 n 个节点 每个节点都有一个值和一个下一个 指向下一个值的指针 我们得到这个 getNodeFromTail Node head int x 所以我的做法是通过遍历一次来求出列表的
  • 更合适地说插入未排序动态数组的摊销 O(1) 与 O(n) ?

    这属于 stackoverflow com help on topic 中的 软件算法 在本例中 是一种将项目添加到动态未排序数组的软件算法 This is chart we made in class about the runtimes
  • 当平方和为N时,如何找到四个变量的所有可能值?

    A 2 B 2 C 2 D 2 N给定一个整数N 打印出整数值的所有可能组合ABCD求解方程 我猜我们可以比暴力做得更好 天真的暴力会是这样的 n 3200724 lim sqrt n 1 for a 0 a lt lim a for b
  • 神经网络的层和神经元

    我想更多地了解神经网络 我正在开发一个 C 程序来制作神经网络 但我坚持使用反向传播算法 很抱歉没有提供一些工作代码 我知道有很多库可以用多种语言创建神经网络 但我更喜欢自己制作一个 关键是我不知道要实现特定目标 例如模式识别或函数近似或其
  • 在 3d 网格中转发(绘制)线

    我需要类似 Bresenham 算法的东西 但是 对于 3d 网格空间来说不完全是这样 我需要 3d 单元网格 边缘尺寸 1 0 从 S 点开始 前进到 K 点 接触 该线接触的所有单元格 即使只有边缘 点被触摸我需要触摸所有 8 个单元
  • 简单的排名算法

    我需要创建一个民意调查 按照项目的好坏顺序创建一个排名列表 我打算向每个用户展示两个项目 让他们选择一个他们认为更好的项目 然后多次重复这个过程 它有点类似于您在社交网络电影 我应该如何根据收到的答案对项目进行排名 看着那 这ELO国际象棋
  • 分而治之算法找到两个有序元素之间的最大差异

    给定一个整数数组 arr 找出任意两个元素之间的差异 使得较大的元素出现在 arr 中较小的数字之后 Max Difference Max arr x arr y x gt y 例子 如果数组是 2 3 10 6 4 8 1 7 那么返回值
  • 如何将多边形放入另一个多边形内[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有两个多边形 如下图所示 左边是 粗多边形 右边是 最终多边形 现在 我正在寻找算法来将 最终多边形 拟合到 粗糙多边形 内 并具有
  • 是否有一种算法可以在线性时间内计算数组反转?

    我知道有多少倒转 en wikipedia org wiki Inversion 28discrete mathematics 29 in an n 元素数组可以在 O n log n 操作使用增强型归并排序 http www geeksf
  • 如何在 C# 中以编程方式创建柔和的颜色?

    根据所需的颜色数量均匀分布地生成它们 如果指定的计数为 8 则看起来像这样 List
  • 当给定块大小时反转单链表

    有一个单连接链表 并给出了块大小 例如 如果我的链表是1 gt 2 gt 3 gt 4 gt 5 gt 6 gt 7 gt 8 NULL我的块大小是4然后反转第一个4元素 然后是第二个 4 个元素 问题的输出应该是4 gt 3 gt 2 g
  • 重写修改后的 goto 语义的算法

    我有一大堆使用旧的自行设计的脚本语言编写的遗留代码 我们将它们编译 翻译成 javascript 该语言有条件跳转 跳转到标签 与普通 goto 语句的区别在于 不可能向后跳转 该语言中没有嵌套的 if 语句或循环 由于 javascrip
  • 如何模拟非确定性有限换能器?

    只需跟踪自动机所处的状态以及它在输入字符串中的位置 就可以在输入字符串上轻松模拟非确定性自动机 但是 如何模拟非确定性传感器 当然 传感器可以将输入符号转换为输出符号 并给出字符串作为输出 而不仅仅是布尔值 这似乎更复杂 因为我们需要以某种
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 测试 python Counter 是否包含在另一个 Counter 中

    如何测试是否是pythonCounter https docs python org 2 library collections html collections Counter is 包含在另一个中使用以下定义 柜台a包含在计数器中b当且

随机推荐

  • iOS 相机视频实时预览与拍摄的照片有偏移

    我正在使用相机工作 相机以实时反馈的形式呈现给用户 当用户单击时 就会创建图像并将其传递给用户 问题是图像被设计为位于最顶部位置 该位置高于实时预览显示的位置 您知道如何调整相机的框架 使实时视频的顶部与他们要拍摄的照片的顶部相匹配吗 我以
  • Apksigner 不验证签名

    我试图使用 apksigner 验证最新 Gmail 应用程序 版本 8 11 25 224 的签名 但失败了 I used apksigner verifiy verbose print certs
  • 使用 d3 在两个节点之间绘制多条边

    我一直在关注 Mike Bostock 的代码这个例子 http bl ocks org 1153292学习如何在 d3 中绘制有向图 并且想知道如何构建代码 以便可以在图中的两个节点之间添加多个边 例如 如果上例中的数据集定义为 var
  • 在 MatterJS 中如何通过标签访问主体?

    这个问题被问到了here https stackoverflow com questions 70477975 how to access a constraint by its label in matter js但没有给出答复 为了澄清
  • 获取整个 Jupyter Notebook 的当前内容

    我有一个正在运行的 Jupyter Notebook 我希望能够从 Python 中访问当前 Jupyter Notebook 的源代码 我的最终目标是将其传递到ast parse这样我就可以对用户的代码进行一些分析 理想情况下 我能够做这
  • R:返回数据框中匹配的行数和列数

    emperor lt rbind cbind Augustus Tiberius cbind Caligula Claudius 如何返回包含序列 us 的所有单元格的行号和列号 即 1 1 1 2 2 2 我们可以使用grepl得到一个v
  • Spring data mongodb字段自增

    如何使集合中的字段自动递增 Document public class Product Id private BigInteger id private String name need to be auto inc private int
  • 如何在我的应用程序中从存折访问通行证?

    我正在创建应用程序 在其中添加并显示从 iOS6 存折应用程序到我的应用程序的通行证 但是当我在模拟器上运行应用程序时 它显示添加的通行证 但是当我在设备上运行相同的应用程序时 它显示我的存折是空的 我已关注iOS6 教程集成存折您的应用程
  • Windows Azure VM (Iaas) 意外重启 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我在 Windows Azure Iaas 上有许多虚拟机托管一个网站 有许多负载平衡的前端虚拟机 全部通过 SQL Express 连接到单个虚拟机
  • 在 Play 框架规范中设置 PhantomJSDriver 上的 Accept-Language

    如何使用 Play Framework 2 2 规范中的特定 Accept Language 语言标头配置 PhantomJSDriver 鉴于此代码 import org specs2 mutable import org specs2
  • 为什么界面构建器不能使用 UIView 的具体通用子类?

    首先 这已被投票关闭 作为为什么不能直接在 Interface Builder 中使用泛型的重复 TLDR 的答案是 IB 使用 Objective C 而 Objective C 不支持泛型 无论如何 没有办法指定泛型的 特殊性 即它使用
  • 计算Mac中目录及其子目录的特定文件类型的数量

    I use ls l filetype wc l但它只能查找当前目录中的文件 我怎样才能计算子目录中具有特定扩展名的所有文件 非常感谢 你可以这样做find命令 find name filetype wc l
  • C# - 应用程序的参数

    我怎样才能做到当程序名称末尾添加参数时它会执行特定的方法或其他什么 另外 这个有名字吗 Example 程序 exe i 我也见过 1 这些被称为命令行参数 有一个MSDN 上的很好的教程 http msdn microsoft com e
  • 跨多个表的 JPA 本机查询

    我将以下内容定义为存储库 dispenseRepository 中的本机查询 Query value SELECT p c s d from patient p consult c script s dispense d where p p
  • REST api:在一次获取中请求多个资源[重复]

    这个问题在这里已经有答案了 我正在尝试设计一个 RESTful API 用户可以在单个 GET 请求中获取单个产品或产品列表 每个产品都有一个唯一的 ID 单个产品 URL 非常简单 http mycompany com api v1 pr
  • R:将多列转换为单列[重复]

    这个问题在这里已经有答案了 我有一个看起来像这样的数据框 ID week1 t week1 a week2 t week2 a 1 12 22 17 4 1 15 32 18 5 1 24 12 29 6 2 45 11
  • Git 注释详细信息

    我读了this http git scm com 2010 08 25 notes html and this https github com blog 707 git notes display但仍然认为它们晦涩难懂 目前为止了解到 创
  • 类型不包含“GetProperties”的定义

    我正在将库项目迁移到 net 标准 当我尝试使用System Reflection调用APIType GetProperties 类型不包含 GetProperties 的定义 这是我的project json version 1 0 0
  • 需要有关上下文菜单的建议

    我有一个 XML 布局 其中有两个编辑文本字段 一个用于 标题 另一个用于 故事 当用户在这些文本字段中输入数据并按后退按钮时 该条目将作为标题集保存在列表视图中 列表视图出现在 A1 活动中 现在A1扩展了Activity 每当 长按 列
  • 使用堆属性按排序顺序打印树 (Cormen)

    我对算法理论 来自 Cormen 感到耳目一新 二进制尝试一章中有一个练习 要求 min heap 属性可以用来打印 n 节点的键吗 树在 O n 时间内排序 展示如何做 或解释为什么不做 我想是的 这是可能的 在最小堆中 节点中的元素小于