我有一个这样的数据结构:
struct X {
float value;
int id;
};
这些向量(大小N(想想 100000),按值排序(在程序执行期间保持不变):
std::vector<X> values;
现在,我想写一个函数
void subvector(std::vector<X> const& values,
std::vector<int> const& ids,
std::vector<X>& out /*,
helper data here */);
用传递的id给出的值的排序子集填充out参数(大小M < N(大约 0.8 倍N)),快速(内存不是问题,这将重复完成,因此构建查找表(来自函数参数的辅助数据)或仅执行一次的其他操作完全可以)。
到目前为止,我的解决方案:
构建包含id ->值中的偏移量的可查找lut(准备,因此恒定运行时间)
创建,大小 N,
为每个 id填充无效 id(线性N) ,复制到(线性M)
循环tmp , 将项目复制到out (线性N )std::vector<X> tmp
values[lut[id]]
tmp[lut[id]]
这在N中是线性的(因为它比M大),但是临时变量和重复复制让我感到困惑。有没有比这更快的方法?请注意,M将接近N ,因此 O( M log N ) 的事情是不利的。
编辑: http: //ideone.com/xR8Vp是上述算法的示例实现,以使所需的输出清晰并证明它在线性时间内是可行的 - 问题是关于避免临时变量或加速它的可能性以其他方式,非线性的东西不会更快:)。