我想知道为什么Java的优先级队列不支持ChangePriority。我在某处(没有详细信息)读到,删除 ChangePriority 允许使用更有效的实现,但不知道它怎么可能 - 二进制堆似乎非常简单/高效的数据结构 - 看不到任何改进空间。另一个线索可能是它可能需要笨拙的接口(interface)来向 PQ 指示哪个元素(大概是堆中的一个位置)改变了它的优先级,但我仍然是 Java 的新手,无法得出结论。
编辑:为什么这不是一个毫无意义的问题?如果您是 Java 的新手(尤其是来自 C/C++ 背景),您会开始想知道诸如所有指针都去了哪里,或者我如何在 Java 中实现 Dijkstra 等问题。
第一个问题已经回答了很多次,据我所知,第二个问题没有一个简单的答案。人们可以期望,在像 Java 这样的语言中,您可以随时使用所有常用的编程工具,开箱即用,封装在一个漂亮的类包装器中。但是突然间你必须自己实现一个带有减少键方法的 PQ,这在 Java 中可能比在 C/C++ 中更尴尬。 在这个问题中,我不是在问如何实现 Dijkstra(这在其他一些线程中得到了很好的回答)。仍然可能有许多 PQ 的应用程序,如果不使用减少键/优先级方法,就无法解决这些问题,例如。如果有比 PQ 中的项目更多的优先更新。在 Dijkstra 中至多有 V
因此,人们可能会认为 Java 的 PQ 缺乏更改优先级有一些严重的原因。不管实际 Java 的 PQ 接口(interface)如何,其原因本身可能很有趣。
最佳答案
我怀疑设计选择是因为它是一个 Queue
。队列的基本操作是入队和出队。 Priority Queue
的不同之处在于,作为入队操作的一部分,它允许一个元素优先于其他元素。大多数 Queue
实现不允许在元素被放入后对其进行操作,尽管有些提供了 peek
功能。所以我们的数据类型是一个队列,我并不是真的“应该”去扰乱内部安排,我也不应该关心它本身。如果我使用队列,我基本上想要先进先出行为。 Queue
话虽如此,您如何实现您想要的行为?我会推荐 TreeMap
。它为您提供类似队列的功能,我可以通过 firstKey()
或 lastKey()
获取第一个或最后一个元素,同时仍然通过我自己的 提供人工排序Comparator
接口(interface)以及通过 Key
访问条目,尽管您的 Key
实现必须提供唯一标识符及其排序顺序。
关于java - 为什么 Java 的优先级队列缺少更改优先级的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31000664/