在本机库中减少密钥/增加密钥支持

时间:2013-11-03 20:03:18

标签: java python heap guava

我注意到Java中大多数默认的堆实现(PriorityQueue,Guava MinMaxPriorityQueue等)和Python(heapq)都不支持CLRS中针对堆使用的增量键/减少键操作。但是,我没有找到解释为什么会这样。有谁知道/是文档中某处描述的基本原理?

1 个答案:

答案 0 :(得分:1)

要修改堆中特定元素的键,您的选项基本上是:

  • 已经有对包含该元素的堆节点的引用。这意味着您必须公开内部堆表示的详细信息,约束您的实现选项(您不能像传统表示那样使用直接数组),并且通常会使您的API更难以使用。
  • 维护HashMap或类似内容,将每个元素指向其在堆中的位置。在用户不修改密钥的情况下,这会产生很大的开销。

此外,Java Comparator期望是无状态的 - 比较操作应始终为相同的输入提供一致的输出 - 并且在大多数需要的算法中很少使用修改密钥,而且很少需要修改密钥。使用优先级队列。