PriorityQueue 正确的数据结构?

PriorityQueue the right data structure?

我需要存储具有执行时间 属性 和对执行者(单位)本身的引用的动作对象。当一个单元执行一个动作时,它会被添加到 PriorityQueue 中,并附上执行该动作所需的时间。该表演者不得再次表演,直到它再次出现在名单上。我以前从未使用过优先级队列,所以我不知道它的功能。

那怎么办呢?让我们看一下以下排序的操作:

time:1600 -> unit:1
time:3700 -> unit:2
time:12000 -> unit:3

现在我想访问这个数据结构并将所有这些 time 属性降低 1600 并使第一单元再次执行。如果我一直加到时间我很快就会运行到最大值。我可以使用很长时间,但最终我会 运行 陷入同样的​​问题。无论如何,我想对于每种类型我都必须遍历整个列表或设置为更改其中的对象属性。插入时,我只是比较在 PriorityQueue 这样的结构中快速插入的时间。

那么我应该使用什么数据结构呢?

您可以轻松地从优先队列中删除第一个元素。

我建议您使用一个额外的整数值 delta 可以存储差异。 使用此方法,如果从优先级队列中删除节点 3700/unit 2,则只需计算 3700-delta。 删除元素后,您必须再次更改此增量。

事实上,您不需要通过向所有条目添加特定值来更改优先级队列中的顺序,因此您不必更改数据结构本身。

为了防止增量增加到无穷大,你必须更新所有 增量达到阈值后的条目。 这种方法的优点是,您只需要更新数据 元素很少。

优先队列是解决这个问题的最佳方法之一。 主要优点是优先级最低的元素总是 在顶部。