C++ 根据条件从两个不同集合中提取一对数字所需的优化?
我需要两个向量的类型C++ 根据条件从两个不同集合中提取一对数字所需的优化?,c++,performance,map,stl,C++,Performance,Map,Stl,我需要两个向量的类型 typedef long long LL ; vector < LL > store1 , store2 ; 两个存储区中的每个元素只使用一次以形成一对 我目前使用的方法非常缓慢。 我的方法 ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); } vector < LL > :: iterator it , fit ; LL
typedef long long LL ;
vector < LL > store1 , store2 ;
两个存储区中的每个元素只使用一次以形成一对
我目前使用的方法非常缓慢。
我的方法
ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
vector < LL > :: iterator it , fit ;
LL ans = 0 ;
// count of pairs
for ( it = store1.begin() ; it != store1.end() ; it++)
{
LL x = (*it) ;
for( fit = store2.begin() ; fit != store2.end() ; fit++){
LL y = (*fit) ;
if ( gcd(x,y) != 1){
ans++ ;
store2.erase(fit); break ;
}
}
}
llgcd(lla,llb){return(b==0?a:gcd(b,a%b));}
向量:迭代器,适合;
LL-ans=0;
//成对数
for(it=store1.begin();it!=store1.end();it++)
{
llx=(*it);
对于(fit=store2.begin();fit!=store2.end();fit++){
LL y=(*fit);
如果(gcd(x,y)!=1){
ans++;
存储2.擦除(适合);断开;
}
}
}
时限:1s
所有号码是否都有存储号码范围的限制?看起来它们是64位整数,但实际上它们会占用整个空间吗?我发现很难相信发布的例程非常慢(除非gcd()函数中存在性能问题)。它只是不符合返回所有匹配夫妇的给定要求。它对第一个映射的每个条目所做的一切就是查找第一个匹配项,增加一个计数器,删除第二个映射中的匹配项。获取所有匹配项需要迭代每个组合并将匹配项添加到结果容器中。@stefaanv使用的Gcd函数是标准的欧几里德方法。@JohnZwinck我已经编辑了我的问题并提到了约束条件。@AmitKumar我建议您重新思考这个问题。如果从长远来看,您的算法的复杂度为^2,那么再多的优化也帮不了您。在短期内,通过将store2划分到所有可用的内核,您可以轻松地并行化该算法。
ll gcd(ll a, ll b) { return (b == 0 ? a : gcd(b, a % b)); }
vector < LL > :: iterator it , fit ;
LL ans = 0 ;
// count of pairs
for ( it = store1.begin() ; it != store1.end() ; it++)
{
LL x = (*it) ;
for( fit = store2.begin() ; fit != store2.end() ; fit++){
LL y = (*fit) ;
if ( gcd(x,y) != 1){
ans++ ;
store2.erase(fit); break ;
}
}
}