java - 为什么 Java 的优先级队列缺少更改优先级的方法?

标签 java priority-queue decrease-key

我想知道为什么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/

相关文章:

algorithm - 如何使二项式堆中的递减键以对数时间运行

algorithm - 为什么 Dijkstra 算法中的 decreasekey 需要 O(logN) 时间?

java - 在控制台执行run命令时如何为java程序提供外部文件?

java - 将 Java AtomicLong 与 javafx2 LongProperty 绑定(bind)

JAVA 字符串转char

c - 如何在作为二叉堆实现的优先级队列中保留相同优先级元素的顺序?

java - PreparedStatementCallback 覆盖率的 Junit 测试用例

c++ 为什么 std::multimap 比 std::priority_queue 慢

C++优先队列,逻辑错误,想不通