Java优先级队列PriotyQueue

优先级队列,顾名思义,和传统“先进后出”的队列相比,优先级队列在元素加入时就根据该元素的优先级插入到相应位置。实际上优先级队列PriotyQueue在poll时还是遵循先进后出,只是数据在进入时已经根据优先级排序了。实现优先级队列需要实现一个Comparator,测试代码如下:

public class PriotyQueueTest {
    //比较器,用于判断两个元素的优先级
    Comparator<Man> t = new Comparator<Man>() {
        @Override
        public int compare(Man o1, Man o2) {
            if(o1.getAge() == o2.getAge())
                return 0;
            if(o1.getAge() > o2.getAge())
                return 1;
            return -1;
        }
    };
    Queue<Man> queue = new PriorityQueue<Man>(11,t);
    //将给定数组添加到优先级队列中
    public void add(int[] nums){
        for(int i = 0 ; i < nums.length ; i++)
            queue.add(new Man(String.valueOf(i),nums[i]));
    }
    //打印函数
    public void print(){
        while(queue.peek()!=null){
            System.out.println(queue.poll().getAge()+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] test = new int[]{5,4,2,3,1};
        PriotyQueueTest q = new PriotyQueueTest();
        q.add(test);
        q.print();
    }
}
//测试实体类
class Man{
    private String name;
    private int age;

    public Man(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

让我好奇的是,这里的add( )函数中究竟发生了什么?我们把这部分源代码拿出来review一下:

 private void siftUpUsingComparator(int k, E x) {
        while (k > 0) {
            int parent = (k - 1) >>> 1;<span style="white-space:pre">		</span>//下标右移一位,相当于除2
            Object e = queue[parent];<span style="white-space:pre">		</span>//得到父节点
            if (comparator.compare(x, (E) e) >= 0)<span style="white-space:pre">	</span>//比较,如果优先级大于父节点则停止向上搜索
                break;
            queue[k] = e;
            k = parent;
        }
        queue[k] = x;
    }

从上面的代码我们可以看到:

1、Queue是基于对象数组实现的,并抽象成树结构;

2、这里的比较器的含义是:直到优先级小于待插元素时停止搜索;

3、删除的时间复杂度为O(1),插入的时间复杂度为O(n)

时间: 2024-11-18 12:59:08

Java优先级队列PriotyQueue的相关文章

JAVA优先级队列测试

package code.test; import java.util.Comparator; import java.util.Iterator; import java.util.PriorityQueue; import java.util.Queue; /** * 实验表明,在java中: * 1.优先级队列打印或者迭代,得到的输出顺序为堆结构数组的顺序,大致有序但不完全保证顺序 * 2.由于堆排序是不稳定排序,在优先级相同的情况下,元素不会保持原来的顺序输出 * Created by

java优先级队列调度

1 { return needtime; } public int getPri() { return pri; } public char getState() { return state; } public void setState(char state) { this.state = state; } } ReadCommand.java文件 import java.io.InputStream; import java.util.ArrayList; import java.util

【转】java中PriorityQueue优先级队列使用方法

优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个demo~ 如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口.下面的方法,实现了根据某个变

《转》JAVA中PriorityQueue优先级队列使用方法

该文章转自:http://blog.csdn.net/hiphopmattshi/article/details/7334487 优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就

java 队列、优先级队列、双向队列示例演示代码

package org.rui.collection2.queues; import java.util.LinkedList; import java.util.PriorityQueue; import java.util.Queue; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.Li

java使用数组实现优先级队列

1.1.  优先级队列的数据结构 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列这种数据结构. 优先级队列(priorityqueue)是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一个新元素(3)删除一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素.对于优先权相同的元素,可按先进先出次序处理或

java面向对象的栈 队列 优先级队列的比较

栈 队列 有序队列数据结构的生命周期比那些数据库类型的结构(比如链表,树)要短得多.在程序操作执行期间他们才被创建,通常用他们去执行某项特殊的任务:当完成任务之后,他们就会被销毁.这三个数据结构还有一个特点就是访问是受到限制的,即在特定时刻只有一个数据项可以被读取或者被删除,但是所谓的移除并不是真的删除,数据项依然在这些数据结构中,只不过因为指针已经指向其他数据项,没有办法访问到,当添加新的数据项时,当初移除的数据项被替代从而永远消失. 栈 队列 优先级队列的模拟思想 1.栈:栈遵循先进后出(F

java中PriorityQueue优先级队列使用方法

优先级队列是不同于先进先出队列的另一种队列.每次从队列中取出的是具有最高优先权的元素. PriorityQueue是从JDK1.5开始提供的新的数据结构接口. 如果不提供Comparator的话,优先队列中元素默认按自然顺序排列,也就是数字默认是小的在队列头,字符串则按字典序排列. 由于网上的资料大多将优先级队列各个方法属性,很少有实例讲解的,为方便大家以后使用,我就写了个demo~ 如果想实现按照自己的意愿进行优先级排列的队列的话,需要实现Comparator接口.下面的方法,实现了根据某个变

java使用优先级队列实现哈夫曼编码

思路: 构建小根堆 根据小根堆实现哈夫曼树 根据哈夫曼树对数据进行编码 代码实现如下: /** * @Author: DaleyZou * @Description: 使用java实现一个哈夫曼编码的小程序 * @Date: Created in 19:45 2018-9-27 * @Modified By: */ public class HuffmanCode { private class Node implements Comparable<Node>{ char ch; // 字符