我注意到Java中大多数默认的堆实现(PriorityQueue,Guava MinMaxPriorityQueue等)和Python(heapq)都不支持CLRS中针对堆使用的增量键/减少键操作。但是,我没有找到解释为什么会这样。有谁知道/是文档中某处描述的基本原理?
答案 0 :(得分:1)
要修改堆中特定元素的键,您的选项基本上是:
HashMap
或类似内容,将每个元素指向其在堆中的位置。在用户不修改密钥的情况下,这会产生很大的开销。此外,Java Comparator
期望是无状态的 - 比较操作应始终为相同的输入提供一致的输出 - 并且在大多数需要的算法中很少使用修改密钥,而且很少需要修改密钥。使用优先级队列。