- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在刷新算法理论(来自 Cormen)。
在二进制尝试的章节中有一个练习要求:
Can the min-heap property be used to print out the keys of an n-node tree in sorted order in O(n) time? Show how, or explain why not.
我认为是的,这是可能的。
在最小堆中,节点中的元素小于其两个子节点。
所以堆的根始终是所有 n 个元素中较小的元素,根的左 child 小于左子树中的所有元素,根的右 child 小于左子树中的所有元素右子树等
因此,如果继续提取根,打印它,然后用较小的子节点更新根,我们将保留最小堆属性,并按排序顺序打印。 (我正在考虑一个不是基于数组的最小堆)。
所以这可以在 O(n) 时间内完成,因为要更新根,我们只需比较 2 个 child 并将根的指针更新为 2 中较小的一个。
但我在解决方案中检查了这里:
Cormen Supplement Solutions
并且 1) 它谈论最大堆 2) 它说它不能在 O(n) 时间内完成:
In a heap, a node’s key is both of its children’s keys. In a binary search tree, a node’s key is its left child’s key, but its right child’s key. The heap property, unlike the binary-searth-tree property, doesn’t help print the nodes in sorted order because it doesn’t tell which subtree of a node contains the element to print before that node. In a heap, the largest element smaller than the node could be in either subtree. Note that if the heap property could be used to print the keys in sorted order in O(n) time, we would have an O(n)-time algorithm for sorting, because building the heap takes only O(n) time. But we know (Chapter 8) that a comparison sort must take (n lg n) time.
从我的角度来看,我可以理解使用最大堆,不可能在 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
时间。
如果您将根节点替换为 4
,您仍然需要通过左分支重新堆化结构,从而增加提取根节点的线性成本的成本。如果堆看起来像这样会怎样
1
/ \
4 9
/\ /\
5 6 11 15
/\
8 7
我查看的形成解决方案的页面
2) Wolfram MathWorld: heap这里的堆特别有助于理解为什么它不是线性操作。
关于algorithm - 使用堆属性按排序顺序打印树 (Cormen),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8110844/
有没有更好的方法用 PHP 将数据输出到 html 页面? 如果我想在 php 中用一些 var 制作一个 div,我会写类似的东西 print (''.$var.''); 或 echo "''.$v
我可以使用 java awt print 来打印文档/文件而不是使用 javax print 吗?我发现在 java awt print 中有一个选项可以使用 AttributedString 将内容
目前我通过以下方式运行 R 脚本: R --slave argument1 argument2 ... 我想知道 R 中关于如何退出脚本并发出警告的最佳实践,q() 会这样做吗? if(!file.
谁能告诉我如何编写一个程序,用 gcc 编译时打印 c ,用 g++ 编译时打印 c++? 最佳答案 #ifdef __cplusplus printf("c++\n"); #else
我需要支持在 KitKat 设备上打印,但我的目标 SDK 是 13(无法更改)。 特别是我需要打印一个 webview。 这是用于打印 webview 的 API: http://developer
我正在尝试创建一个简单的函数,其中 python 将根据您的年份输入计算年龄。我已经尝试了几种方法,但我没有运气 atm。 附:对不起,我是新手。 ame = input(" Enter your n
JavaFX 2.0 是否支持打印?我有一个文本区域,我从中获取文本然后我想打印它,但似乎没有这个功能。 当然,这里我说的是打印到打印机。 :) 最佳答案 尚不支持。作为一种解决方法,您可以使用 Ja
我试图找出printOn的重点。我查看了一些实现它的类,看起来它只是帮助打印不同数据类型的单位。这是准确的吗? 如果是这样,有人能指出我如何为我自己的类(class)实现这一点的正确方向吗?我将在可能
我无法让 IE 打印我的 Canvas (使用 excanvas 生成)...我使用的是最新版本的 excanvas。 http://dl.dropbox.com/u/997831/canvas.ht
我搜索了很多但没有人回答我的问题,我读到在这样的信号处理程序中使用 cout 是不安全的: void ctrlZHandler(int sig_num) { //SIGTSTP-18
我有兴趣打印一系列查询。我有以下代码。 start = datetime.datetime(2012, 2, 2, 6, 35, 6, 764) end = datetime.datetime(201
public class javaClass { public static void main(String [] arg) { String row1 = "A____A"
我需要写入前一行的命令,例如不带\n 的 print()。 下面是一些示例代码: a=0 print("Random string value") if a==0: print_to_prev
我有一个使用 UIKit 和 Objective C 的旧 iOS 应用程序,我目前正在将其移植到 SwiftUI 和 Swift。一切都很顺利,我喜欢 Swift 和 SwiftUI。该应用程序已经
我创建了一个求和函数,它接受一个开始编号和一个结束编号,并返回这两点之间的总和答案 def print_sum_equations(start_number,end_number):
在 Perl 6 中,print 和有什么区别? , put和 say ? 我怎么看 print 5不同,但 put 5和 say 5看起来一样。 最佳答案 put $a就像 print $a.Str
我正在使用 here 中的 getOrgChart 库,我正在尝试打印整个图表,而不仅仅是可见部分。不幸的是,当使用标准库打印功能时,它只会打印出第一部分,而我不知道如何打印整个图表(该图表相当宽,大
我制作了一个非常适合 A4 页面的 View 。现在我想打印它。请注意,我没有使用drawRect或类似的东西,只是一个带有 subview 和文本标签的普通 View 。我的问题是,我对该 View
由于 Cocoa-Java 已弃用,我正在将 Cocoa-Java 代码迁移到 Cocoa + JNI。该代码打印存储在文件中的图像。新的 Cocoa 代码基本上是: NSImage *image =
这个问题已经有答案了: Printing a TDBGrid (4 个回答) 已关闭 6 年前。 如何在不安装或下载组件的情况下打印 DBGrid? 或者 如何将 DBGrid 的数据放入 RichE
我是一名优秀的程序员,十分优秀!