在做一道算法时需要使用大顶堆,所以查了一下记录。

使用PriorityQueue实现大顶堆

PriorityQueue默认是一个小顶堆,然而可以通过传入自定义的Comparator函数来实现大顶堆。如下代码实现了一个初始大小为11的大顶堆。这里只是简单的传入一个自定义的Comparator函数,就可以实现大顶堆了。

    1. private static final int DEFAULT_INITIAL_CAPACITY = 11;
      1. PriorityQueue<Integer> maxHeap=new PriorityQueue<Integer>(DEFAULT_INITIAL_CAPACITY, new Comparator<Integer>() {
        1. @Override
          1. public int compare(Integer o1, Integer o2) {
            1. return o2-o1;
              1. }
                1. });
              1.  

              PriorityQueue的逻辑结构是一棵完全二叉树,存储结构其实是一个数组。逻辑结构层次遍历的结果刚好是一个数组。

              例子:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

              可以使用大顶堆保存,比堆中的数小就进堆。

                1. import java.util.ArrayList;
                  1. import java.util.PriorityQueue;
                    1. import java.util.Comparator;
                      1. public class Solution {
                        1. public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
                          1. ArrayList<Integer> result = new ArrayList<Integer>();
                            1. int length = input.length;
                              1. if(k > length || k == 0){
                                1. return result;
                                  1. }
                                    1. PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k, new Comparator<Integer>() {
                                        1. @Override
                                          1. public int compare(Integer o1, Integer o2) {
                                            1. return o2.compareTo(o1);
                                              1. }
                                                1. });
                                                  1. for (int i = 0; i < length; i++) {
                                                    1. if (maxHeap.size() != k) {
                                                      1. maxHeap.offer(input[i]);
                                                        1. } else if (maxHeap.peek() > input[i]) {
                                                          1. Integer temp = maxHeap.poll();
                                                            1. temp = null;
                                                              1. maxHeap.offer(input[i]);
                                                                1. }
                                                                  1. }
                                                                    1. for (Integer integer : maxHeap) {
                                                                      1. result.add(integer);
                                                                        1. }
                                                                          1. return result;
                                                                            1. }
                                                                              1. }
                                                                            1.  

                                                                            补充介绍其offer和poll方法:

                                                                            ①优先队列中不能存放空元素。 
                                                                            ②压入元素后如果数组的大小不够会进行扩充,上面的queue其实就是一个默认初始值为11的数组(也可以赋初始值)。

                                                                            poll 方法每次从 PriorityQueue 的头部删除一个节点,也就是从小顶堆的堆顶删除一个节点,而remove()不仅可以删除头节点而且还可以用 remove(Object o) 来删除堆中的与给定对象相同的最先出现的对象。

                                                                            具体的源码解读,参考

                                                                            转载自:https://blog.csdn.net/weixin_30363263/article/details/80862578

                                                                            PriorityQueue实现大顶堆的更多相关文章

                                                                            1. 剑指offer:数据流中的中位数(小顶堆+大顶堆)

                                                                              1. 题目描述 /** 如何得到一个数据流中的中位数? 如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值. 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两 ...

                                                                            2. 优先队列PriorityQueue实现 大小根堆 解决top k 问题

                                                                              转载:https://www.cnblogs.com/lifegoesonitself/p/3391741.html PriorityQueue是从JDK1.5开始提供的新的数据结构接口,它是一种基于 ...

                                                                            3. 大顶堆与小顶堆应用---寻找前k小数

                                                                              vector<int> getLeastNumber(vector<int>& arr,int k){ vector<int> vec(k,); if(== ...

                                                                            4. heap c++ 操作 大顶堆、小顶堆

                                                                              在C++中,虽然堆不像 vector, set 之类的有已经实现的数据结构,但是在 algorithm.h 中实现了一些相关的模板函数.下面是一些示例应用 http://www.cplusplus.c ...

                                                                            5. 剑指Offer28 最小的K个数(Partition函数应用+大顶堆)

                                                                              包含了Partition函数的多种用法 以及大顶堆操作 /*********************************************************************** ...

                                                                            6. Python使用heapq实现小顶堆(TopK大)、大顶堆(BtmK小)

                                                                              Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) | 四号程序员 Python使用heapq实现小顶堆(TopK大).大顶堆(BtmK小) 4 Replies 需1求:给出N长 ...

                                                                            7. 堆排序(大顶堆、小顶堆)----C语言

                                                                              堆排序 之前的随笔写了栈(顺序栈.链式栈).队列(循环队列.链式队列).链表.二叉树,这次随笔来写堆 1.什么是堆? 堆是一种非线性结构,(本篇随笔主要分析堆的数组实现)可以把堆看作一个数组,也可以被 ...

                                                                            8. 《排序算法》——堆排序(大顶堆,小顶堆,Java)

                                                                              十大算法之堆排序: 堆的定义例如以下: n个元素的序列{k0,k1,...,ki,-,k(n-1)}当且仅当满足下关系时,称之为堆. " ki<=k2i,ki<=k2i+1;或k ...

                                                                            9. USACO Running Away From the Barn /// 可并堆 左偏树维护大顶堆

                                                                              题目大意: 给出以1号点为根的一棵有根树,问每个点的子树中与它距离小于等于m的点有多少个 左偏树 https://blog.csdn.net/pengwill97/article/details/82 ...

                                                                            随机推荐

                                                                            1. idea使用svn提交时出现错误Warning not all local changes may be shown due to an error

                                                                              参考于https://www.cnblogs.com/zhujiabin/p/6708012.html 解决方案: 1.File > Settings > Version Control ...

                                                                            2. AdapterViewFlipper功能 自动播放的图片库

                                                                              案例中有"上一个""下一个""自动播放",但是我觉得可以更加完善一下,点击自动播放,按钮变成"停止播放",在按" ...

                                                                            3. UVa 12174 Shuffle (滑动窗口)

                                                                              题意:你正在使用的音乐播放器有一个所谓的乱序播放功能,即随机打乱歌曲的播放顺序.假设一共有s首歌, 则一开始会给这s首歌随机排序,全部播放完毕后再重新随机排序.继续播放,依次类推.注意,当s首歌播放完 ...

                                                                            4. 从Google Earth 中下载三维模型

                                                                              https://www.cnblogs.com/chidou-yin/p/4306224.html

                                                                            5. 解决:无法在发送 HTTP 标头之后进行重定向。 跟踪信息: 在 System.Web.HttpResponse.Redirect(String url, Boolean endResponse, Boolean permanent) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>……

                                                                              问题:在MVC的过滤器中验证用户状态时报如下错误:   无法在发送 HTTP 标头之后进行重定向. 跟踪信息:   在 System.Web.HttpResponse.Redirect(String  ...

                                                                            6. 图形与游戏中3D数学基础的说明

                                                                              1.左手坐标系与右手坐标系没有好坏之分,不同的研究领域和不同的背景下,选择不同的坐标系:传统计算机图形学采用“左手坐标系”,线性代数则倾向于使用右手坐标系 坐标系由坐标轴与坐标原点组成.原点定义坐标系 ...

                                                                            7. [FMX]在你的跨平台应用中使用剪贴板进行复制粘贴

                                                                              [FMX]在你的跨平台应用中使用剪贴板进行复制粘贴 2017-08-10 • Android.C++ Builder.Delphi.iOS.教程 • 暂无评论 • swish •浏览 516 次 VC ...

                                                                            8. 在ContextLoaderListener中使用注解注入的类和job中使用注解注入的类

                                                                              场景:在ContextLoaderListener子类中加载job,为JobFactory的实现类声明@Component后,在ContextLoaderListener子类中为scheduler设置 ...

                                                                            9. RandomForest in Spark MLLib

                                                                              决策树类模型 ml中的classification和regression主要基于以下几类: classification:决策树及其相关的集成算法,Logistics回归,多层感知模型: regres ...

                                                                            10. Jersey Client传递中文参数

                                                                              客户端需要客户端的包: <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jerse ...