【问题标题】:Why doesn't max-priority queue have DECREASE-KEY?为什么最大优先级队列没有 DECREASE-KEY?
【发布时间】:2011-12-25 14:51:48
【问题描述】:

在讨论堆数据结构时,例如CLRS,最大优先级队列只需要INSERT、MAXIMUM、EXTRACT-MAX和INCREASE-KEY。但是为什么它也没有DECREASE-KEY,至少它的操作也会使堆属性失效呢?它实际上不重要吗?

【问题讨论】:

  • 我认为这与最小优先级队列通常没有 INCREASE-KEY 的方式有关,即使它是一个完全定义良好的操作。我的猜测是,这只是一些不会出现的东西。此外,w00t 获得 1337 声望!
  • 我可以发誓我以前问过这个确切的问题,但我找不到。

标签: algorithm data-structures


【解决方案1】:

如果您有 MAX-HEAP,则在 CLRS 第 3 版的第 6.2 节“维护堆属性”中,DECREASE-KEY 将是 MAX-HEAPIFY。

【讨论】:

    【解决方案2】:

    没有什么能阻止您在二进制堆中实现 DECREASE-KEY。它可以在 O(log N) 内完成而不会破坏任何不变量。

    我的猜测是它不包括在内,因为它并不经常需要。

    【讨论】:

    • 实现这个的伪代码是什么?只是在当前位置堆起来?
    • 假设“heapify”意味着向下移动当前节点直到满足堆不变量,那么是的。
    【解决方案3】:

    FWIW 我的 CLR V1 讨论了 INSERT、MIN、EXTRACT-MIN、UNION、DECREASE-KEY 和 DELETE,但我们可以通过翻转符号转换为您的版本。

    我认为这个集合是由使用优先级队列的算法的要求驱动的,例如最小生成树、Dijstra 最短路径和(我怀疑)A*。例如,如果您查看关于最小生成树的章节的开头,您会看到一条注释,如果将二叉堆替换为斐波那契堆,则可以加快 Prim 算法的速度。

    【讨论】:

    • “我的 CLR V1”?你能解释一下吗?确切地说,我所问的实际上对应于“为什么最小优先级队列没有 INCREASE-KEY?”
    • “my CLR v1”指的是本书的第一版,作者没有 Stein。不过,第二段回答了您的问题:使用优先级队列的算法只需要能够将条目移到队列的前面,而不是后面。
    猜你喜欢
    • 2010-10-18
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 2019-01-02
    • 2019-10-14
    相关资源
    最近更新 更多