美文网首页
数据结构--优先队列

数据结构--优先队列

作者: Hayley__ | 来源:发表于2021-02-02 10:37 被阅读0次
优先队列:

出队顺序和入队顺序无关,与优先级相关。动态选择优先级高的先处理(动态数据)。

实现优先队列
底层结构 入队 出队(拿出最大元素)
普通线性结构 O(1) O(n)
顺序线性结构 O(n) O(1)
O(logn) O(logn)
public class PriorityQueue<E extends Comparable<E>> implements Queue<E>{

    private MaxHeap<E> maxHeap;

    public PriorityQueue(){
        maxHeap = new MaxHeap<>();
    }

    @Override
    public int getSize() {
        return maxHeap.size();
    }

    @Override
    public boolean isEmpty() {
        return maxHeap.isEmpty();
    }

    @Override
    public E getFront() {
        return maxHeap.findMax();
    }

    @Override
    public void enqueue(E e) {
        maxHeap.add(e);
    }

    @Override
    public E dequeue() {
        return maxHeap.extractMax();
    }
}

相关示例

    // 215 数组中的第K个最大元素
    public int findKthLargest(int[] nums, int k) {
        //默认为最小堆
        PriorityQueue<Integer> pq = new PriorityQueue<>();

        for (int i = 0; i < k; i++) {
            pq.add(nums[i]);
        }

        for (int i = k; i < nums.length; i++) {
            //判断剩余元素中存不存在值大于 最小堆中的堆顶(最小元素)
            if (!pq.isEmpty() && nums[i] > pq.peek()){
                pq.remove();
                pq.add(nums[i]);
            }
        }

        return pq.peek();
    }

    // 剑指41 最小的k个数 二叉堆
    public int[] getLeastNumbers(int[] nums, int k) {
        //转成最大堆
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());

        for (int i = 0; i < k; i++) {
            pq.add(nums[i]);
        }

        for (int i = k; i < nums.length ; i++) {
            if (!pq.isEmpty() && nums[i] < pq.peek()) {
                pq.remove();
                pq.add(nums[i]);
            }
        }

        int[] res = new int[k];
        for (int i = 0; i < k; i++) {
            res[i] = pq.remove();
        }
        return res;
    }

top k 和select k的问题既可以用快排解决也可以用优先队列解决。

时间 空间
快排 O(n) O(1)
优先队列 O(nlogk) O(k)

优先队列的优势:不需要一次性知道所有数据,适用于数据流,或者极大规模数据。

稳定性

排序前相等的俩个元素,排序后相对位置不变。
不稳定 排序是交换最后一个元素与做大元素。

相关文章

  • 看图说话数据结构之二项队列(优先队列)——原理解析

    数据结构之二叉堆(优先队列)——原理解析,数据结构之二叉堆(优先队列)——java实现,数据结构之左式堆(优先队列...

  • GO语言实现 一 堆与优先队列

    堆与优先队列 优先队列 之前我们讲过队列这种数据结构,队列的特点是先进先出,那什么是优先队列呢?一般来说,优先队列...

  • 优先队列(堆)

    优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当...

  • 二叉堆应用二:优先队列

    优先队列 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。删...

  • 数据结构(三)-- 优先队列

    什么是优先队列? 我们在前几篇文章中学习过了“队列”这种数据结构。那么优先队列和普通队列有什么区别的呢?普通队列的...

  • PriorityQueue原理与最简实现[kotlin]

    什么是优先队列? 优先队列是一种能按照数据的优先级,在输出的时候能依次输出的一种数据结构。 优先队列的核心方法 *...

  • 堆排序

    1. 优先队列 说堆排序之前,我们要从一种特殊的数据结构——优先队列说起。优先队列最大的两个特征:插入元素和删除最...

  • 优先队列--底层是二叉堆

    1.什么是优先队列?普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予...

  • C++ 优先队列

    普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除(LIFO)。在优先队列中,元素被赋予优先级。...

  • 总结

    第一周(04.01 - 04.07) 本周主要学习了数据结构的内容 具体包括:优先队列、并查集、树状数组 优先队列...

网友评论

      本文标题:数据结构--优先队列

      本文链接:https://www.haomeiwen.com/subject/jumjtltx.html