http://blog.csdn.net/yangzhongblog/article/details/8607632
1 概念
优先级队列PriorityQueue是不同于先进先出队列的另一种队列,每次从队列中取出的是具有最高优先权的元素。优先队列可用有序数组或堆实现,但是常用堆来实现,下面是2种实现效率的比较:
使用:用于获取优先权最高的元素。
例如:在1000个数中找到最大的那个数。如果用快速排序对数就行排序,时间复杂度是O(NlogN);而用优先队列(用队实现)存储数据,然后取出最大元素(此处为优先权最大的元素)这种数据结构时间复杂度为O(logN)。
2 java.util.PriorityQueue方法
java.util.PriorityQueue是从JDK1.5开始提供的新的数据结构接口。如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列。优先级队列不允许 null 元素。其提供的方法如下:
3 使用例子
定义存储对象
- <span style="font-size:18px;">package zyang.priorityQueue;
- /**
- * Fuction:
- * @version 2013-2-24 下午8:15:59
- * @since 1.0
- */
- public class Student {
- private int number;
- private String name;
- public Student(int number,String name){
- this.number=number;
- this.name=name;
- }
- public int getNumber() {
- return number;
- }
- public void setNumber(int number) {
- this.number = number;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public String toString() {
- return "Student [number=" + number + ", name=" + name + "]";
- }
- }
- </span>
定义比较器
- <span style="font-size:18px;">package zyang.priorityQueue;
- import java.util.Comparator;
- /**
- * Fuction:
- * 按学号排序 先按学号排序,学号相等时,按姓名排序 o1>o2返回-1,o1=o2返回0,o1<o2返回1
- * @author
- * @version 2013-2-24 下午8:16:26
- * @since 1.0
- */
- public class ComparetorByNumber implements Comparator {
- public int compare(Object o1, Object o2) {
- Student s1=(Student)o1;
- Student s2=(Student)o2;
- //compare by number
- int result=s1.getNumber() > s2.getNumber() ? 1 :(s1.getNumber() == s2.getNumber() ? 0 : -1);
- //if number is equal, then compare by name
- if (result==0){
- int compareByName=s1.getName().compareTo(s2.getName());
- if(compareByName>0)
- result=1;
- else if(compareByName==0)
- result=0;
- else
- result=-1;
- } //end if
- return (-result); //如果是result,则a>b比较结果后排序是ba,-result代表倒序排序
- }
- }</span>
优先队列的使用
- <span style="font-size:18px;">package zyang.priorityQueue;
- import java.util.PriorityQueue;
- /**
- * Fuction:
- *
- * @author yangzhong E-mail:yangzhonglive@gmail.com
- * @version 2013-2-24 下午8:15:39
- * @since 1.0
- */
- public class PriorityQueueApp {
- /**
- * @param args
- */
- public static void main(String[] args) {
- PriorityQueue<Student> priorityQueue=new PriorityQueue<Student>(3,new ComparetorByNumber());
- Student[] student={new Student(3,"wangwu"),new Student(2,"lisi"),
- new Student(5,"xiaowang"),new Student(8,"lihua")};
- for(Student s: student){
- priorityQueue.offer(s); //use offer() method to add elements to the PriorityQueue
- }
- System.out.println("size: " + priorityQueue.size()); //print size
- System.out.println("peek: " + priorityQueue.peek()); //return highest priority element in the queue without removing it
- System.out.println("size: " + priorityQueue.size()); //print size
- System.out.println("poll: " + priorityQueue.poll()); //return highest priority element and removes it from the queue
- System.out.println("size: " + priorityQueue.size()); //print size
- while(!priorityQueue.isEmpty()) {
- System.out.print(priorityQueue.poll() + " ");
- }
- System.out.println(" the end!");
- }
- }
- </span>
输出结果如下:
相关推荐
5. **自定义比较器**:虽然默认PriorityQueue使用元素的自然顺序,但我们可以通过传递Comparator对象给PriorityQueue构造函数来自定义元素的排序规则。 6. **线程安全**:PriorityQueue不是线程安全的,这意味着在...
使用C#中的二进制堆的自定义优先级队列实现。为个人/俱乐部项目编写。 (据我所知)它符合大多数.NET标准。不是线程安全的。 信息 这段代码是从Java项目转换为利用C#功能集并在结构上更合理的东西。虽然原始的Java...
1. **数据结构**:PriorityQueue使用二叉堆作为其数据结构,通常是一个最小堆,保证队头元素是最小的。 2. **比较规则**:队列中的元素必须实现Comparable接口,或者在创建队列时提供Comparator,以便进行排序。如果...
`PriorityQueue`不允许使用`null`元素,而且依赖于自然顺序的优先级队列也不允许插入不可比较的对象,否则会导致`ClassCastException`。 #### 类型参数 - **E**:表示集合中所保存元素的类型。 #### 已实现的接口 ...
`android-priorityqueue`是一个专门为Android设计的轻量级库,它提供了一个简单且干净的解决方案来处理待办事项(To-Do)列表,使得任务按照优先级进行排序和处理。这个库的核心理念是帮助开发者快速实现具有优先级...
PriorityQueue是Java中的一个优先级队列,它可以根据元素的优先级对元素进行排序,并且允许高效地获取和删除最高优先级的元素。
优先级队列头文件priorityqueue.h
而"pradeepr-roboticist-PriorityQueue-MEX-Matlab-1f6c329"可能是项目仓库的一个特定版本,由作者pradeepr-roboticist维护,版本号为1f6c329,这通常是Git版本控制系统中的一个提交ID,代表了该项目在某一时刻的源...
2. **基于堆实现**:PriorityQueue底层使用了最小堆结构,即父节点的值总是小于或等于其子节点的值。这保证了队列头部总是具有最高优先级的元素。 3. **默认的比较器**:如果没有提供自定义的比较器,PriorityQueue...
PriorityQueue 优先队列实现C# PriorityQueueLib: 基于二进制堆的最小/最大优先级队列实现PriorityQueueTests: PriorityQueue单元测试
PriorityQueue PriorityQueue是最小/最大PriorityQueue的Javascript实现。 近期变动 V1.0 在1.0版中,删除了对setComparator(func)和setEquals(func)的支持。 这些方法导致了意外的行为。 需要这些功能时,请...
在JDK中,PriorityQueue的实现方式是使用数组来存储元素,并使用二叉堆来维护元素的顺序。 三、JDK中PriorityQueue的实现方式 在JDK中,PriorityQueue的实现方式是使用数组来存储元素,并使用二叉堆来维护元素的...
`PriorityQueue`不是线程安全的,如果在多线程环境下使用,需要额外的同步机制。 4. **容量和扩容** - `PriorityQueue`的初始容量为11,当元素数量超过容量时,队列会自动扩容。扩容的策略是每次扩大为原来的两倍...
可以使用 PriorityQueue 来存储基本数据类型的包装类,如 Integer、Long 等。PriorityQueue 的元素默认排列顺序是升序排列,但可以通过自定义比较器来改变排列顺序。 示例代码: ```java static Comparator...
在这个例子中,`multiMergeSort`方法首先递归地将数组分割成两半,然后使用优先队列`pq`进行归并。当遍历完所有子序列后,`temp`数组中存储了完整的排序结果,最后再复制回原数组`arr`。 在`main`方法中,我们创建...
理解`Comparator`的工作原理以及如何在`PriorityQueue`中使用它,可以帮助我们更有效地利用这个数据结构来满足特定的排序需求。在实际编程中,`PriorityQueue`结合`Comparator`可以广泛应用于需要优先级处理任务、...
优先级队列cpp文件PriorityQueue.cpp
DelayQueue 是一个 BlockingQueue,无界阻塞队列,内部使用的是 PriorityQueue,PriorityQueue 使用完全二叉堆来实现队列元素排序。在向 DelayQueue 队列中添加元素时,会给元素一个 Delay(延迟时间)作为排序条件...
- **实现**:Java的`PriorityQueue`使用堆数据结构实现,提供`offer`、`poll`等方法,并保证每次取出的都是当前队列中优先级最高的元素。 - **特性**:默认按照自然顺序或自定义比较器进行排序,不允许插入null,...