• PriorityQueue实现大顶堆


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

    使用PriorityQueue实现大顶堆

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

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

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


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

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

    1. import java.util.ArrayList;
    2. import java.util.PriorityQueue;
    3. import java.util.Comparator;
    4. public class Solution {
    5. public ArrayList<Integer> GetLeastNumbers_Solution(int[] input, int k) {
    6. ArrayList<Integer> result = new ArrayList<Integer>();
    7. int length = input.length;
    8. if(k > length || k == 0){
    9. return result;
    10. }
    11. PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k, new Comparator<Integer>() {
    12. @Override
    13. public int compare(Integer o1, Integer o2) {
    14. return o2.compareTo(o1);
    15. }
    16. });
    17. for (int i = 0; i < length; i++) {
    18. if (maxHeap.size() != k) {
    19. maxHeap.offer(input[i]);
    20. } else if (maxHeap.peek() > input[i]) {
    21. Integer temp = maxHeap.poll();
    22. temp = null;
    23. maxHeap.offer(input[i]);
    24. }
    25. }
    26. for (Integer integer : maxHeap) {
    27. result.add(integer);
    28. }
    29. return result;
    30. }
    31. }

    补充介绍其offer和poll方法:

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

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

    具体的源码解读,参考


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

  • 相关阅读:
    Javascript FP-ramdajs
    微信小程序开发
    SPA for HTML5
    One Liners to Impress Your Friends
    Sass (Syntactically Awesome StyleSheets)
    iOS App Icon Template 5.0
    React Native Life Cycle and Communication
    Meteor framework
    RESTful Mongodb
    Server-sent Events
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707699.html
Copyright © 2020-2023  润新知