何时在PriorityQueues中对元素进行排序?

时间:2019-01-06 14:39:52

标签: java data-structures priority-queue

PriorityQueue类是按优先级插入元素还是只是当我们仅轮询元素时才发现优先级最高的元素并返回?

2 个答案:

答案 0 :(得分:2)

来自JDK本身的源代码(格式化我的):

表示为平衡二进制堆的优先级队列:public class ListView_Appointmnet_LectView { private String start_date; private String subject; private String start_time; private String student_ID; private String status; public ListView_Appointmnet_LectView() { } public ListView_Appointmnet_LectView(String start_date, String subject, String start_time, String student_ID, String status) { this.start_date = start_date; this.subject = subject; this.start_time = start_time; this.student_ID = student_ID; this.status = status; } public String getStart_date() { return start_date; } public void setStart_date(String start_date) { this.start_date = start_date; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getStart_time() { return start_time; } public void setStart_time(String start_time) { this.start_time = start_time; } public String getStudent_ID() { return student_ID; } public void setStudent_ID(String student_ID) { this.student_ID = student_ID; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } 的两个子级分别为queue[n]queue[2*n+1]

如果比较器为空,优先级队列将按queue[2*(n+1)]或元素的自然排序进行排序:对于每个节点{{1 }},以及comparatorn的每个后代d。假定队列为非空,则具有最低值的元素位于n中。

因此,您可以将PriorityQueue中元素的插入/删除视为提供结果以及堆平衡的操作。

答案 1 :(得分:1)

正如其他人所提到的,PriorityQueue类在内部维护一个binary heap,并且该堆中各项的顺序由默认顺序或由Comparator确定。二进制堆保存在列表中。

您的问题询问何时订购元素。当您向队列中添加项目或从队列中删除项目时,项目的顺序将重新排列,以使优先级最高的项目位于堆的顶部:列表中的索引0。因此,主要问题的答案是PriorityQueue 始终知道哪个是优先级最高的项目。这使得peek()函数非常有效。

列表其余部分中的项目顺序涉及更多。列表的其余部分是有序的,但不一定是已排序的。这样的排序使得在插入或删除之后重新排列堆是有效的。有关堆排序的详细信息,请参见上面链接的有关二进制堆的文章。