介绍
在很多应用中,允许用例引用已经进入优先队列中的元素是必要的。做到这一点的一种简单方法是给每个元素一个索引。另外一种常见的情况是用例已经有了总量为N的多个元素,而且可能还同时使用了多个(平行)数组来存储这些元素的信息。此时,其他无关的用例代码可能已经在使用一个整数索引来引用这些元素了。
关联索引的泛型优先队列的API:
public class IndexMinPQ<Item extends Comparable |
|
---|---|
IndexMinPQ(int maxN) | 创建一个最大容量为maxN的优先队列 |
void insert(int k, Item item) | 插入一个元素,将它和索引k相关联 |
void change(int k, Item item) | 将索引为k的元素设为item |
boolean contains(int k) | 是否存在索引为k的元素 |
void delete(int k) | 删去索引k及其相关联的元素 |
Item minKey() | 返回最小元素 |
int minIndex() | 返回最小元素的索引 |
int delMin() | 删除最小元素并返回它的索引 |
boolean isEmpty() | 优先队列是否为空 |
int size() | 优先队列的元素数量 |
这种数据结构可以理解成:它能够快速访问数组的一个特定子集中的最小元素。换句话说,可以将pq的IndexMinPQ类优先队列看做数组pq[0…N-1]中的一部分元素的代表。
实现
1 | public class IndexMinPQ<Key extends Comparable<Key>> implements Iterable<Integer> { |
含有N个元素的基于堆的索引优先队列所有操作在最坏情况下的成本:
操作 | 比较次数的增长数量级 |
---|---|
insert() | logN |
change() | logN |
contains() | 1 |
delete() | logN |
minKey() | 1 |
minIndex() | 1 |
delMin() | logN |
使用索引优先队列的多向归并
将多个有序的输入流归并成一个有序的输出流。
1 | public class Multiway { |