优先队列是一种抽象数据类型

前言

请结合二叉堆一起看

应用场景

  • 模拟系统:事件的键为发生时间,系统按时间顺序处理事件
  • 任务调度:键值对应优先级,决定先处理哪些任务
  • 数值计算:键值代表计算错误,按照键值指定的顺序来修正他们

API

  • delMax() 删除最大的元素
  • insert() 插入元素

用例

  1. public class MaxPQ<Key extends Comparable<Key>> {
  2. MaxPQ(key[] a)
  3. void insert(Key v)
  4. Key max()
  5. Key delMax()
  6. Boolean isEmpty()
  7. int size()
  8. }

基于二叉堆的优先队列

  1. import { exch, less, swin, sink } from './util';
  2. class MaxPQ <Key extends Comparable<Key>> {
  3. private pq: Array<number | string>;
  4. private N: number;
  5. constructor(maxN) {
  6. this.pq = new Array(maxN + 1);
  7. this.N = maxN;
  8. }
  9. public isEmpty(): boolean {
  10. return this.N === 0;
  11. }
  12. public size(): number {
  13. return this.N;
  14. }
  15. public insert(v): void {
  16. this.pq[++N] = v;
  17. swin(N)
  18. }
  19. public delMax(v): void {
  20. const max = this.pq[1];
  21. exch(1, N--);
  22. this.pq.pop();
  23. sink(1);
  24. return max;
  25. }
  26. }