簡體   English   中英

檢查元素是否在兩個向量中的最快方法

[英]Fastest way to check if element is in both vectors

所以,認為我們有兩個向量,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

    }

}

你的方法是O(M * N)因為它在vec2的每個元素的vec1的元素數量中調用std::find線性。 您可以通過以下幾種方式改進它:

  • 排序vec2可以讓你減少時間到O((N + M)* Log M) - 即你可以在范圍vec2.begin(), vec2.end()上使用二進制搜索
  • 對兩個向量進行排序將允許您在O(N Log N + M Log M)中搜索 - 您可以使用類似於合並排序范圍的算法來查找線性時間內的匹配對
  • 使用vec2元素的哈希集可以讓你減少到O(N + M)的時間 - 現在集合的構造時間和搜索都是線性的。

一種簡單的方法是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中元素的數量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM