数据结构与算法-队列

  • 定义
    队列是ListInsert发生表尾、ListDelete发生在表头的线性表,主要操作:入队、出队。数据结构与算法-队列_第1张图片

  • 术语
    表头-队头,表尾-队尾,插入-入队,删除-出队

  • 特点

  1. 先入先出(FIFO)
  2. 插入的位置是length+1,删除的位置的是1,一般读取第1个数据元素

循环队列(Circular Queue)

顺序队列的假溢出问题

数据结构与算法-队列_第2张图片

队列上溢出
  • 真上溢:队列真正满时再入队。
  • 假上溢:rear已指向队尾,但队列前端仍有空位置。
  • 解决假上溢的方法
    方法一:每次删除队头一个元素后,把整个队列往前移一个位置(造成时间浪费)。
    方法二:使用循环队列方法二:使用循环队列

循环队列-基本思想

  • 首位相连:把a[0]和a[5]想象成邻居

数据结构与算法-队列_第3张图片

循环队列-满与空的判定

循环队列空和满,队头和队尾相连,如何区分?
数据结构与算法-队列_第4张图片

解决方法
  1. 另外设置一个标志,以区别队空、队满;
  2. 少用一个元素空间
    队空:front = = rear
    队满:(rear+1)%M = = front

数据结构与算法-队列_第5张图片

优先队列(Priority Queue)

优先队列是正常入,按照优先级出的队列。

实现机制

  • Heap(Binary,Binomial,Fibonacci)
  • Binary Search Tree

小顶堆(Mini Heap)
数据结构与算法-队列_第6张图片
大顶堆(Max Heap)

数据结构与算法-队列_第7张图片

各种堆实现的时间复杂度对比图
数据结构与算法-队列_第8张图片

java.util.PriorityQueue

java.util.PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。
参考:https://www.cnblogs.com/CarpenterLee/p/5488070.html

LeetCode[703]Kth largest Element in a Stream

description

Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth distinct element.

Your KthLargest class will have a constructor which accepts an integer k and an integer array nums, which contains initial elements from the stream. For each call to the method KthLargest.add, return the element representing the kth largest element in the stream.

Example

int k = 3;
int[] arr = [4,5,8,2];
KthLargest kthLargest = new KthLargest(3, arr);
kthLargest.add(3); // returns 4
kthLargest.add(5); // returns 5
kthLargest.add(10); // returns 5
kthLargest.add(9); // returns 8
kthLargest.add(4); // returns 8

Note

You may assume that nums’ length ≥ k-1 and k ≥ 1.

code
class KthLargest {
final PriorityQueue q;
    final int k;
    
    public KthLargest(int k, int[] a) {
        this.k = k;
        q = new PriorityQueue<>(k);
        for (int n : a)
            add(n);
    }

    public int add(int n) {
        if (q.size() < k)
            q.offer(n);
        else if (q.peek() < n) {
            q.poll();
            q.offer(n);
        }
        return q.peek();
    }
}

/**
 * Your KthLargest object will be instantiated and called as such:
 * KthLargest obj = new KthLargest(k, nums);
 * int param_1 = obj.add(val);
 */

运行结果:
数据结构与算法-队列_第9张图片

阻塞队列(Blocking queue)

你可能感兴趣的:(数据结构与算法)