【发布时间】:2015-07-20 09:13:55
【问题描述】:
我有一个无符号向量的向量。我需要找到所有这些无符号向量的交集,为此我编写了以下代码:
int func()
{
vector<vector<unsigned> > t;
vector<unsigned> intersectedValues;
bool firstIntersection=true;
for(int i=0;i<(t).size();i++)
{
if(firstIntersection)
{
intersectedValues=t[0];
firstIntersection=false;
}else{
vector<unsigned> tempIntersectedSubjects;
set_intersection(t[i].begin(),
t[i].end(), intersectedValues.begin(),
intersectedValues.end(),
std::inserter(tempIntersectedSubjects, tempIntersectedSubjects.begin()));
intersectedValues=tempIntersectedSubjects;
}
if(intersectedValues.size()==0)
break;
}
}
每个单独的向量有 9000 个元素,“t”中有很多这样的向量。当我分析我的代码时,我发现 set_intersection 花费的时间最多,因此在调用 func() 时会导致代码变慢。有人可以建议我如何使代码更有效率。
我正在使用:gcc (GCC) 4.8.2 20140120 (Red Hat 4.8.2-15)
编辑:对向量“t”中的各个向量进行排序。
【问题讨论】:
-
你的向量排序了吗?您也可以尝试在末尾而不是开头插入找到的元素。
-
@Galik 是的,向量已排序。
-
你知道交叉口的大小吗?如果交集预计“小”,那可能会改变算法。
-
@StegVerner 您列出了编译器,但没有发布使用的编译器选项。如果您正在分析未优化的代码,那么在您构建程序的优化版本之前,您的结果将毫无意义。
-
@PaulMcKenzie 我使用的编译器选项是 O3