我正在寻找一种在 C++ 中构建多个向量联合的快速方法。
更具体地说:我有一组向量(通常是 15-20 vector
s,有几千个无符号整数;总是排序且唯一的,因此它们也可以是std::set
)。对于每个阶段,我选择其中的一些(通常是 5-10 个)并构建一个联合向量。比我保存联合向量的长度并选择其他一些向量。这将进行数千次。最后我只对最短联合向量的长度感兴趣。
Small example:
V1: {0, 4, 19, 40}
V2: {2, 4, 8, 9, 19}
V3: {0, 1, 2, 4, 40}
V4: {9, 10}
// The Input Vectors V1, V2 … are always sorted and unique (could also be an std::set)
Choose V1 , V3;
Union Vector = {0, 1, 2, 4, 19, 40} -> Size = 6;
Choose V1, V4;
Union Vector = {0,4, 9, 10, 19 ,40} -> Size = 6;
… and so on …
目前我正在使用std::set_union
,但我确信一定有更快的方法。
vector< vector<uint64_t>> collection;
vector<uint64_t> chosen;
for(unsigned int i = 0; i<chosen->size(); i++) {
set_union(collection.at(choosen.at(i)).begin(),
collection.at(choosen.at(i)).end(),
unionVector.begin(),
unionVector.end(),
back_inserter(unionVectorTmp));
unionVector.swap(unionVectorTmp);
unionVectorTmp.clear();
}
我很感激每一个参考。
编辑 27.04.2017 一个新想法:
unordered_set<unsigned int> unionSet;
unsigned int counter = 0;
for(const auto &sel : selection){
for(const auto &val : sel){
auto r = unionSet.insert(val);
if(r.second){
counter++;
}
}
}