【发布时间】:2015-07-14 05:23:59
【问题描述】:
我有一个大小为 44,000 的 vector<vector<int> > A;。现在我需要将“A”与另一个向量相交:vector<int> B,大小为 400,000。 A 的内部向量的大小,即向量是可变的,并且最大大小为 9,000 个元素,我正在使用以下代码:
for(int i=0;i<44000;i++)
vector<int> intersect;
set_intersection(A[i].begin(),A[i].end(),B.begin(),B.end(),
std::back_inserter(intersect));
有什么方法可以使代码高效。向量 A 中的所有元素都已排序,即它们的形式为 ((0,1,4,5),(7,94,830,1000)), etc。即all elements of A[i]'s vector < all elements of A[j]'s vector if i<j.
编辑:我想到的解决方案之一是将所有 A[i] 合并到另一个向量 mergeB 中,使用:
vector<int> mergedB;
for(int i=0;i<44000;i++)
mergedB.insert(mergedB.begin(),mergedB.end(),A[i])
vector<int> intersect;
set_intersection(mergedB.begin(),mergedB.end(),B.begin(),B.end(),
std::back_inserter(intersect));
但是,我不明白为什么我使用两种代码获得几乎相同的性能。有人可以帮我理解这一点
【问题讨论】:
-
@BaummitAugen 解决方案是使用 back_inserter ......但我的问题在这里不同......我的向量 A 已排序......我正在寻找一种更有效的方法来相交它...
-
@StegVerner 我相信您可以通过从向量构造两个
unordered_maps 来使运算成为线性而不是二次。 -
@TheParamagneticCroissant 你能用一个例子解释一下吗
-
相交的结果是什么? A 和 B 中都存在的向量
?