这是Sedgewick的一个例子; Wayne:算法第4版。但我无法弄明白。请帮助!
以下是代码:
package algorithm2_4;
import chap1.*;
public class Multiway {
private Multiway() {
}
private static void merge(In[] streams) {
int n = streams.length;
IndexMinPQ<String> pq = new IndexMinPQ<String>(n);
for (int i = 0; i < n; i++)
if (!streams[i].isEmpty())
pq.insert(i, streams[i].readString());
while (!pq.isEmpty()) {
StdOut.print(pq.minKey() + " ");
int i = pq.delMin();
if (!streams[i].isEmpty())
pq.insert(i, streams[i].readString());
}
StdOut.println();
}
/**
* Reads sorted text files specified as command-line arguments; merges them
* together into a sorted output; and writes the results to standard output.
* Note: this client does not check that the input files are sorted.
*
* @param args
* the command-line arguments
*/
public static void main(String[] args) {
int n = args.length;
In[] streams = new In[n];
for (int i = 0; i < n; i++)
streams[i] = new In(args[i]);
merge(streams);
}
}
如果
多%m1.txt
A C D E
%更多m2.txt
B S Z
然后
%java Multiway m1.txt m2.txt
A B C D E S Z
顺便说一句,IndexMinPQ
是下面IndexMinPQ
API的基于堆的实现
我不太明白为什么上面的代码可以将几个排序列表合并为一个
有人可以向我解释一下吗?
class IndexMinPQ<Item extends Comparable<Item>>
IndexMinPQ(int maxN)
创建容量优先级队列maxN
可能包含
0
和maxN-1
之间的索引。void insert(int k, Item item)
插入item
;将其与k
联系起来void change(int k, Item item)
将与k
相关联的项目更改为item
boolean contains(int k)
k
与某个项目相关联吗?
void delete(int k)
删除k
及其相关项
Item min()
返回最小项目
int minIndex()
返回最小项目的索引
int delMin()
删除最小项并返回其索引
boolean isEmpty()
优先级队列是空的吗?
int size()
优先级队列中的项目数