C++ 计算两个向量之间共享元素数的最快方法

C++ 计算两个向量之间共享元素数的最快方法,c++,boost,vector,comparison,intersection,C++,Boost,Vector,Comparison,Intersection,假设我有两个大小相同的向量vectorv1,v2我想计算v1和v2中有多少元素具有相同的NodeDataID。例如,如果v1={,,}和v2={,,},那么我想返回2,因为v1和v2中有两个元素共享相同的节点数据:7和64 在C++中最快的方法是什么?< /P> 仅供参考,请注意类型NodeDataIDs定义为我使用boost作为: typedef adjacency_list<setS, setS, undirectedS, NodeData, EdgeData> myGraph;

假设我有两个大小相同的向量
vectorv1,v2我想计算v1和v2中有多少元素具有相同的NodeDataID。例如,如果
v1={,,}
v2={,,}
,那么我想返回2,因为v1和v2中有两个元素共享相同的节点数据:7和64

<>在C++中最快的方法是什么?< /P> 仅供参考,请注意类型
NodeDataIDs
定义为我使用boost作为:

typedef adjacency_list<setS, setS, undirectedS, NodeData, EdgeData> myGraph;
typedef myGraph::vertex_descriptor NodeDataID;
typedef邻接列表myGraph;
typedef myGraph::顶点描述符NodeDataID;

但是这并不重要,因为我们可以使用操作符==(也就是说,可以执行
v1[i]。second==v2[j]。second
)来比较两个NodeDaId。

将第一个向量的元素放入哈希表中。迭代第二个向量,测试每个元素是否在哈希表中

哈希表的优点是可以在固定时间内完成插入和查找。这意味着,可以在线性时间内找到交点。这是最优的,因为无论采用何种算法,都必须至少查看每个向量元素一次


Boost具有侵入性,但它(顾名思义)具有侵入性。

最简单的解决方案就是将第一个向量的元素放入一个集合,然后对于第二个向量,我们将每个元素插入这个集合(ret=myset.insert(an_id)),如果ret.second为false,则该元素存在,因此我们增加了一个计数器

set<NodeDataID> myset;
int counter = 0;

for(int i = 0; i < v1.size(); ++i)
   myset.insert(v1[i].second);

for(int i = 0; i < v2.size(); ++i)
{
   pair<set<NodeDataID>::iterator,bool> ret = myset.insert(v2[i].second);
   if(ret.second == false)
      ++counter;
}
设置myset;
int计数器=0;
对于(int i=0;i
使用STL算法std::设置交点并获取其大小如何?如果你有一个向量的
NodeDataID
组件的排序集合,你可以迭代其中一个,然后在第二个组件上进行对分搜索(即
std::equal_range
,与
std::distance
配对)。@linello
std::set_intersection
希望元素是有序的,因此通常可以,不能在
std::vector
@KerrekSB上使用,但是,正如您所看到的,它没有排序@shn:to向量的排序是O(n*log(n)),然后计数是O(n)。对于未排序的、幼稚的解决方案,这仍然比O(n^2)好。为了更清楚,请您使用我的配置用代码完成您的答案,好吗?谢谢