java PriorityQueue是FIFO队列吗?

krugob8w  于 2023-01-24  发布在  Java
关注(0)|答案(6)|浏览(150)

PriorityQueue实现了Queue,但PriorityQueue是否是类似于Queue的FIFO数据结构?

bpsygsoo

bpsygsoo1#

Queue接口:
队列通常,但不一定,以FIFO(先进先出)方式对元素进行排序。例外的是优先级队列,其根据所提供的比较器或元素的自然排序来对元素进行排序
因此PriorityQueue是一个异常,只有当比较器按顺序排序时,它才成为FIFO队列。

fumotvh3

fumotvh32#

不,不是。根据Javadoc
优先级队列的元素根据其自然顺序排序,或者根据队列构造时提供的Comparator排序,具体取决于使用的构造函数
以及
此队列的头是相对于指定排序的最小元素

sigwle7e

sigwle7e3#

PriorityQueue不关心FIFO / LIFO。它处理优先级。在几个对象具有相同优先级的情况下-您不能指望任何FIFO LIFO行为。

beq87vna

beq87vna4#

优先级队列是一种数据结构,它使元素保持一致的内部顺序-在Java实现中,这种顺序是在构造时指定的。队列的头部和其他元素的顺序由您指定的排序标准确定。
例如,假设您有一个包含学生的PriorityQueue,并且您设置的排序是年龄升序-队列的头部将包含最年轻的学生,队列的尾部将包含最老的学生。当您向PriorityQueue添加内容时,学生将根据其年龄插入到正确的位置,因为这是您指定的排序,所以他们的插入顺序无关紧要。

jjhzyzn0

jjhzyzn05#

Java中的队列不一定遵循FIFO(先进先出)原则。https://docs.oracle.com/javase/9/docs/api/java/util/Queue.html
队列通常(但不一定)以FIFO(先进先出)的方式对元素排序。优先级队列是个例外,它根据提供的比较器或元素的自然顺序对元素排序。
PriorityQueue不遵循FIFO原则,这一定是您出现问题的原因

xcitsw88

xcitsw886#

这取决于您使用的比较器。
例如,假设你使用优先级队列来管理一个事件队列,该队列中的事件被安排在未来调用,无论是在挂钟未来还是在名义上的批处理模式未来,最高优先级基本上是最早的时间,你可以使用如下的比较器:

first.time < second.time

如果比较器只是比较两个事件的时间,它们将以未定义的顺序出队,很可能不是FIFO。
但是,您可以维护入队操作的计数;将其存储在优先级队列元素中;并使用队列操作作为平局决胜局进行比较。示例:

first.time < second.time || ( first.time == second.time && first.count < second.count )

然后,您将获得FIFO行为。如果计数器为32位,您可以在1000小时内每秒执行1000次入队操作,然后计数器返回。如果计数器为64位,您可以在500年以上的时间内每秒执行10亿次入队操作,然后计数器返回。即使计数器返回,您也可以简单地对所有现有的优先级队列元素重新编号:将它们都放到一个向量中;对向量进行排序;用每个向量元素的向量元素编号重写每个向量元素的计数器;并重新插入到优先级队列中,这个向量大小就成为了你的新计数器。

相关问题