在堆数据结构的讨论中,例如在CLRS中,最大优先级队列只需要INSERT,MAXIMUM,EXTRACT-MAX和INCREASE-KEY。但为什么它也没有DECREASE-KEY,至少它的操作也会使堆属性失效?它几乎不重要吗?
答案 0 :(得分:3)
没有什么能阻止你在二进制堆中实现DECREASE-KEY。它可以在O(log N)中完成而不会破坏任何不变量。
我的猜测是它不包含在内,因为它不经常使用。
答案 1 :(得分:2)
如果你有一个MAX-HEAP,在第3版CLRS第6.2节“维护堆属性”中,DECREASE-KEY将是MAX-HEAPIFY。
答案 2 :(得分:1)
FWIW我的CLR V1谈论INSERT,MIN,EXTRACT-MIN,UNION,DECREASE-KEY和DELETE,但我们可以通过翻转符号转换为您的版本。
我认为这个集合是由使用优先级队列的算法的要求驱动的,例如最小生成树,Dijstra最短路径和(我怀疑)A *。例如,如果你看一下关于最小生成树的章节的开头,你可以看到一个注释,如果用fibonacci堆替换二进制堆,可以加速Prim的算法。