Java优先队列

按照Java api的说法:

java.util.PriorityQueue.PriorityQueue()

Creates a PriorityQueue with the default initial capacity (11) that orders its elements according to their natural ordering.

优先队列PriorityQueue的默认排序方式为其中元素的自然顺序。下面利用这一特点,把它当成个小顶堆来求出数组中的前k大元素

package structure;

import java.util.Iterator;
import java.util.PriorityQueue;
import java.util.Queue;

/**
 * Java中的优先队列使用
 * @author Dreamy
 *
 */
public class PriorityQueueDemo {
    /**
     * @param args
     */
    public static void main(String[] args) {
        //Java中的PriorityQueue 默认排序方式为自然顺序
        int[] numbers = {4,5,2,1,9,6,8,7};
        findTopK(numbers);
    }

    //找出数组中top k大
    private static void findTopK(int[] numbers) {

        Queue<Integer> queue = new PriorityQueue<Integer>();

        final int k = 3;
        for(int i=0;i<k;i++)
            queue.add(numbers[i]);

        for(int i=k;i<numbers.length;i++){
            int min = queue.peek();
            if(numbers[i]>min){
                queue.poll();
                queue.offer(numbers[i]);
            }
        }

        Iterator<Integer> itr = queue.iterator();
        while(itr.hasNext()){
            int num = itr.next();
            System.out.println(num);
        }
    }

}

当然啦,PriorityQueue中还可以存放自定义的对象,可以让元素对象实现Comparable借口,重写compareTo方法来实现自定义排序。或者,也可以再构造PriorityQueue的时候,指定自定义的比较器Comparator(作为参数)。

另外PriorityQueue是非线程安全的,如果要考虑多线程下的同步问题,可以使用concurrent包下的PriorityBlockingQueue。

时间: 2024-10-21 15:33:05

Java优先队列的相关文章

ZOJ 3447 Doraemon&#39;s Number Game(Java优先队列&#183;BigInteger)

题意  给你一个数组  你每次可以从中删掉2到k个数  然后把删掉的数的积加入到原数组  直到最后只剩一个数   求这样能得到的最大值和最小值的差 每次选的数值越小  选的数量越少  最后得到的结果肯定越大  因为这样大的数可以乘以最大的倍数  运算的次数也是最多从而使+1的次数最多  这显然是有利于最后结果的增大的 同理  每次选的数越大  选的数越多  最后得到的结果越小 这样最大值就是每次取最小的两个数  最大值就是每次取最大的k个数了   很容易用优先队列实现   结果会很大  用Jav

LeetCode1046 最后一块石头的重量(贪心—Java优先队列简单应用)

题目: 有一堆石头,每块石头的重量都是正整数. 每一回合,从中选出两块最重的石头,然后将它们一起粉碎.假设石头的重量分别为 x 和 y,且 x <= y.那么粉碎的可能结果如下: 如果 x == y,那么两块石头都会被完全粉碎:如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x.最后,最多只会剩下一块石头.返回此石头的重量.如果没有石头剩下,就返回 0. 提示: 1 <= stones.length <= 301 <= stones[i]

Java优先队列(PriorityQueue)示例

我们知道队列是遵循先进先出(First-In-First-Out)模式的,但有些时候需要在队列中基于优先级处理对象.举个例子,比方说我们有一个每日交易时段生成股票报告的应用程序,需要处理大量数据并且花费很多处理时间.客户向这个应用程序发送请求时,实际上就进入了队列.我们需要首先处理优先客户再处理普通用户.在这种情况下,Java的PriorityQueue(优先队列)会很有帮助. PriorityQueue类在Java1.5中引入并作为 Java Collections Framework 的一部

Java优先队列的简单实现

最近在学习最小生成树时,用到了优先队列这个结构,琢磨这自己也来写下,搞了半天终于写出来了,于是就记录下 import java.util.ArrayList; class MyHeap<Type extends Comparable<Type>>{ private ArrayList<Type> data; private int MaxSize; private int size; public MyHeap() { this.MaxSize=0; this.size

Java优先队列一些问题

无论怎么初始化,优先队列的长度不是固定的,你add一个,size就会++,满了就会扩容. 所以必须手动维护优先队列的大小,比如topK问题. 定义一个len,len<max的时候就直接add,len++ 满了就poll之后,再add 将一堆无序的元素放进优先队列中,每次调用poll,都能获得当前小顶堆,也就是里面的最小值. 优先队列默认是小顶堆,可以自己传入排序方法.大顶堆就传相反的排序方法就好了. //我定义的类 public static class Node{ int cap; int p

《分布式服务框架原理与实践》- 总结一下吧

我们听过无数的道理,却仍旧过不好这一生.额,我说的是技术! <分布式服务框架原理与实践>这本书,一直在讲一些大道理,和具体的业务和我本身的工作已经没多大关系了.但是,不管怎么样,还得总结下吧.别人的道理,并不是自己的道理!自己的的道理才是硬道理,哪怕是烂道理! 个人觉得这本书讲得太宽泛,或者说讲得不够深入,或者文学范不够,总之,感觉不够吸引人,如果赶时间,还是算了吧. 他列举了许多需要注意的方面,而且就每个方面以单独的章节进行前因,后果的展示,应该说有比较好的或者统一的数据结构结构吧.下面稍微

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

第一篇博客——基于数组的优先队列(java版)

看过园子里和CSND上那么多大牛精彩的博客后,早就按捺不住想亲手写上几篇.奈何每次坐在电脑前准备敲字的时候,立马赶到浑身不自在,无从下手.实在是因为自高考之后,大学以来,本人几乎就再没动笔写过一篇文字,写作水平退化实在严重.今天鼓起勇气开始写作博客,一方面希望通过多写慢慢地找回写作的感觉,一方面也希望通过博客和大家多多交流,共同进步. 既然是第一次试手,就写个简单易懂的内容——优先队列. 话不多说,先上代码. 1 /** 2 * @author Mr Left 3 * @version 1.0

数据结构-堆实现优先队列(java)

队列的特点是先进先出.通常都把队列比喻成排队买东西,大家都很守秩序,先排队的人就先买东西.但是优先队列有所不同,它不遵循先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出.这就很像堆的特征:总是移除优先级最高的根节点. 重点:优先级队列,是要看优先级的,谁的优先级更高,谁就先得到权限.不分排队的顺序! 上篇文章解释了堆的概念实现,现在用堆实现优先队列: //最大堆 import java.util.ArrayList; public class Heap<E extends Com