堆和二叉搜索树
Posted
技术标签:
【中文标题】堆和二叉搜索树【英文标题】:Heaps and Binary Search Trees 【发布时间】:2015-06-25 15:10:32 【问题描述】:-
与使用 k-ary heap 实现的 (Max-heapify) 相关的运行时是什么。
从渐近的角度来说,k-ary heap 是否比二叉堆更有效?
在实践中,k 元堆是否比二叉堆更有效?
可以将搜索树实现为 k 数组吗?
【问题讨论】:
【参考方案1】:你问了很多问题,所以我会尝试依次回答所有问题。
在 k 元堆上 heapify 操作的运行时间为 O(n),与 k 无关。这不是很明显,但大多数介绍性算法教科书都证明了 k = 2 的情况。
让我们对一般的 k 元堆进行分析,然后我们可以通过设置 k = 2 将其与二进制堆进行比较。在 k 元堆中,find-min 操作的成本是 O(1)(只看堆的顶部),heapify 操作的成本是 O(n),如上所述。当向 k-ary 堆添加新元素时,运行时间与堆的高度成正比,即 O(logk n) = O(log n / log k) (如下使用对数的基数变化公式)。在 big-O 表示法中包含对数的底并不常见,但在这种情况下,因为 k 是一个参数,我们不能忽略它的贡献。在 extract-min 操作中,我们需要从树的顶部向下工作。在每个级别,我们最多查看当前节点的 k 个子节点以找到最大的子节点,然后可能进行向下交换。这意味着每层有 O(k) 个工作,并且有 O(log n / log k) 个层,所以完成的工作是 O(k log n / log k)。渐近地,对于任何固定的 k,这些操作的运行时间分别为 O(1)、O(n)、O(log n) 和 O(log n),因此 k-ary heap 和二叉堆。
但在实践中存在差异。看到这一点的一种好方法是使 k 非常非常大(例如,10100)。在这种情况下,删除的成本会非常大,因为每个节点最多有 10100 个子节点,这将使相应二叉树的高度相形见绌。对于 k 的中等值(k = 3 或 4),使用 3 元或 4 元树实际上可能比二叉树更快,但实际上最好的找出方法是剖析看看会发生什么。参考位置、缓存和划分速度等因素的相互作用都会相互竞争以影响运行时间。
是的!有诸如多路搜索树之类的东西。其中最著名的一个是B-tree,它实际上是一个非常有趣的数据结构。
希望这会有所帮助!
【讨论】:
以上是关于堆和二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章