堆和二叉搜索树

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,它实际上是一个非常有趣的数据结构。

希望这会有所帮助!

【讨论】:

以上是关于堆和二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

Treap——堆和二叉树的完美结合,性价比极值的搜索树

C++二叉树进阶(二叉搜索树,KV模型)

C++二叉树进阶(二叉搜索树,KV模型)

算法笔记:树堆和图

二叉搜索和二叉搜索树的区别?

二叉树二叉搜索树