检查元素是否在两个向量中的最快方法

时间:2015-01-23 17:43:06

标签: c++ algorithm vector

所以,认为我们有两个向量,vec1和vec2。什么是仅对元素执行某些操作的最快方法,这两个元素都在两个向量中。 到目前为止,我已经做到了这一点。简单地说,我们如何更快地实现这一目标,或者有任何方式:

vector<Test*> vec1;
vector<Test*> vec2;

//Fill both of the vectors, with vec1 containing all existing 
//objects of Test, and vec2 containing some of them.


for (Test* test : vec1){

    //Check if test is in vec2
    if (std::find(vec2.begin(), vec2.end(), test) != vec2.end){

        //Do some stuff

    }

}

2 个答案:

答案 0 :(得分:6)

您的方法是O(M * N),因为它为std::find的每个元素vec2的元素数量调用vec1为线性。您可以通过多种方式改进它:

  • 排序vec2可让您减少时间到O((N + M)* Log M) - 即您可以在范围vec2.begin(), vec2.end() <上使用二进制搜索/ LI>
  • 对两个向量进行排序可让您在O(N Log N + M Log M)中搜索 - 您可以使用类似于合并已排序范围的算法来查找匹配对在线性时间
  • 使用vec2元素的哈希集可以让你减少到O(N + M)的时间 - 现在集合的构建时间和搜索都是线性的

答案 1 :(得分:2)

一种简单的方法是std::unordered_set

vector<Test*> vec1;
vector<Test*> vec2;

//Fill both of the vectors, with vec1 containing all existing 
//objects of Test, and vec2 containing some of them.
std::unordered_set<Test*> set2(vec2.begin(),vec2.end());

for (Test* t : vec1) {
   //O(1) lookup in hash set
   if (set2.find(t)!=set2.end()) {
     //stuff
    }
 }

O(n + m),其中n是vec1中元素的数量,m是vec2中元素的数量     }