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

时间:2012-11-09 21:49:11

标签: c++ boost vector comparison intersection

假设我有两个大小相同的向量vector< pair<float, NodeDataID> > v1, v2;我想计算v1和v2中有多少元素具有相同的NodeDataID。例如,如果v1 = {<3.7, 22>, <2.22, 64>, <1.9, 29>, <0.8, 7>}v2 = {<1.66, 7>, <0.03, 9>, <5.65, 64>, <4.9, 11>},则我想返回 2 ,因为v1和v2中有两个共享相同NodeDataID的元素:7和64。

在C ++中最快的方法是什么?

仅供参考,请注意NodeDataIDs类型定义为我使用boost作为:

typedef adjacency_list<setS, setS, undirectedS, NodeData, EdgeData> myGraph;
typedef myGraph::vertex_descriptor NodeDataID;

但它并不重要,因为我们可以使用operator ==比较两个NodeDataID(也就是说,可以做v1[i].second == v2[j].second

2 个答案:

答案 0 :(得分:2)

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

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

Boost有boost::intrusive::hashtable,但它(顾名思义)是侵扰性的。

答案 1 :(得分:0)

最简单的解决方案是将第一个向量的元素放在一个集合中然后为第二个向量插入此集合中的每个元素(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;
}