我正在阅读Robert Sedgewick的C ++算法中的间接优先级队列。
下面的实现将pq
维护为一些客户端数组中的索引数组。例如,如果客户端为operator<
类型的参数定义Index
,那么,当fixUp
将pq[j]
与pq[k]
进行比较时,它会比较data.grade[pq[j]]
根据需要使用data.grade[pq[k]]
。我们假设 Index是一个包装类,其对象可以索引数组,这样我们就可以在k
中保持与索引值qp[k]
对应的堆位置,这样我们就可以实现&#34;改变优先级&#34;和&#34;删除&#34;。我们为堆中的所有pq[qp[k]]=qp[pq[k]]=k
维护不变k
。
template <class Index>
class PQ
{
private:
int N; Index* pq; int* qp;
void exch(Index i, Index j)
{
int t;
t = qp[i]; qp[i] = qp[j]; qp[j] = t;
pq[qp[i]] = i; pq[qp[j]] = j;
}
void fixUp(Index a[], int k);
void fixDown(Index a[], int k, int N);
public:
PQ(int maxN)
{
pq = new Index[maxN+1];
qp = new int[maxN+1]; N = 0;
}
int empty() const { return N == 0; }
void insert(Index v) { pq[++N] = v; qp[v] = N; fixUp(pq, N); }
Index getmax()
{
exch(pq[1], pq[N]);
fixDown(pq, 1, N-1);
return pq[N--];
}
void change(Index k)
{
fixUp(pq, qp[k]);
fixDown(pq, qp[k], N);
}
};
以这种方式使用间接的主要缺点是使用了额外的空间。当优先级队列的最大大小可以小得多时,索引数组的大小必须是数据数组的大小。在数组中的现有数据之上构建优先级队列的另一种方法是让客户端程序创建包含键及其数组索引作为关联信息的记录,或者使用索引键和客户端提供的重载operator<
即可。然后,如果实现使用链接分配表示。然后,优先级队列使用的空间将与任何时候队列中的最大元素数成比例。如果必须保留空间并且优先级队列仅涉及数据阵列的一小部分,则此类方法优先于程序9.12。
作者在下面的意思是什么?
我们假设Index是一个包装类,其对象可以索引数组
在改进中,作者建议:
在数组中的现有数据之上构建优先级队列的另一种方法是让客户端程序创建包含具有其数组索引作为关联信息的键的记录,或者使用具有客户端提供的重载的索引键的记录
operator<
。然后,如果实现使用链接分配表示
作者在他提出的两点中的含义是什么?