2015-01-23 3 views
3

Итак, подумайте, что у нас есть два вектора 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 

    } 

} 
+4

ли сортируются векторы? Можете ли вы использовать другую структуру данных? – Borgleader

+0

@Bordleader, даже если это не так, вы можете стабильно сортировать их по времени O (nlogn + mlogm), что, несомненно, превосходит штаны O (n * m) – IdeaHat

+0

Если они отсортированы, 'std :: upper_bound' будет Очень полезно. Если нет, существует несколько способов сделать это: 'std :: unordered_set ' является одним из способов рассмотрения. – WhozCraig

ответ

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), где п число элементов в vec1, м является количество элементов в vec2 }

6

Ваш подход O (M * N), так как он вызывает std::find линейный по числу элементов vec2 для каждого элемента vec1. Вы можете улучшить его несколькими способами:

  • Сортировка vec2 позволит сократить время на O ((N + M) * Log M) - то есть вы можете использовать бинарный поиск по диапазону vec2.begin(), vec2.end()
  • Сортировка оба векторов позволит вам искать в O (N Log N + M Log M) - вы можете использовать алгоритм, аналогичный слияние отсортированных диапазонов, чтобы найти совпадающие пары в линейное время
  • Использование хэша-набор для vec2 элемент l et, вы сокращаете время до O (N + M) - теперь как время построения набора, так и поиск в нем линейны.
+0

Глупые мысли ... если N << M, то с сортировкой вы можете сортировать только меньшее, а затем выполнять двоичный поиск по ней, O (N Log N + M log N). Не красиво, и все же не так хорошо, как хэш. – IdeaHat

+0

@IdeaHat Вообще говоря, лучше всего проверить относительные размеры двух векторов и sort/hash/etc. меньший из двух. – dasblinkenlight

Смежные вопросы