重新排序已排序的数组以使另一个数组排名相关

时间:2019-05-30 16:10:19

标签: c++ arrays algorithm

我需要使用Iman-Conover方法来模拟高维联合分布。速度至关重要。瓶颈之一归结为以下问题:给定一个大小相同的排序数组x和一个未排序数组y,如何有效地对x重新排序,使得xy是完全相关的。

直接,我做到了

template<typename indtype, typename valtype>
struct compare
{
  valtype *a;
  compare(valtype *a): a(a){}
  bool operator() (indtype i, indtype j) { return a[i] < a[j]; }
};


// `xReordered` stores the result.
// `recycle` is an auxiliary container storing indices.
template<typename indtype, typename valtype>
void reorder(valtype *x, indtype xsize, valtype *y, 
             valtype *xReordered, 
             std::vector<indtype> &recycle)
{
  recycle.resize(xsize);
  for(indtype i = 0; i < xsize; ++i) recycle[i] = i;
  std::sort(recycle.begin(), recycle.end(), 
    compare<indtype, valtype> (y));
  for(indtype i = 0; i < xsize; ++i) 
    xReordered[recycle[i]] = x[i];
}

有更快的方法吗?我认为排序是必要的,可能会占总时间成本,但是没有辅助容器recycle是否可以做到?

谢谢!

0 个答案:

没有答案