爱抄书

d-堆

2022-05-30  本文已影响0人  Sun东辉

二叉堆是如此简单,以至于它们几乎总是用在需要优先队列的时候。d-堆是二叉堆的简单推广,它恰像是一个二叉堆,只是所有的节点都有 d 个儿子(因此,二叉堆是 2-堆)。

注意⚠️,d-堆要比二叉堆浅得多,它将 Insert 操作的运行时间改进为 O(log_d N)。然而,对于大的 d,DeleteMin 操作费时得多,因为虽然树浅了,但是 d 个儿子中最小者是必须找出的,如使用标准的算法,这会花费 d-1 次比较,于是将操作的用时提高到 O(d \log_d N)。如果 d 是常数,那么当然两种操作的运行时间都是 O(\log N)。虽然仍然可以使用一个数组,但是,现在找出儿子和父亲的乘法和除法都有个因子 d,除非 d 是 2 的幂,否则将会大大增加运行时间,因为我们再也不能通过二进制移位来实现除法了。d-堆在理论上很有趣,因为存在许多算法,其插入次数比 DeleteMin 的次数多很多(因此理论上的加速是可能的)。当优先队列太大不能完全装入主存的时候,d-堆也是很有用的。在这种情况下,d-堆能够以与 B 树大致相同的方式发挥作用。最后,有证据显示,在实践中 4-堆可以胜过二叉树。

除不能执行 Find 外,堆的实现最明显的缺点是:将两个堆合并成一个堆是困难的操作。这种附加的操作叫做 Merge(合并)。存在许多实现堆的方法使得 Merge 操作的运行时间是 O(\log N)

上一篇下一篇

猜你喜欢

热点阅读