Какой у вас алгоритм пересечения? Может быть, есть какие-то улучшения?
Вот альтернативный метод
Я не знаю, будет ли это быстрее или медленнее, но это может быть что-то, чтобы попробовать. Прежде чем сделать это, я также рекомендую использовать профилировщик, чтобы убедиться, что вы действительно работаете в точке доступа. Измените наборы чисел, которые вы пересекаете, чтобы использовать вместо них std::set<int>
. Затем переберите наименьшее из них, просматривая каждое найденное значение. Для каждого значения в наименьшем наборе используйте метод find
, чтобы увидеть, присутствует ли число в каждом из других наборов (для производительности выполните поиск от наименьшего к наибольшему).
Это оптимизируется в том случае, если число найдено не во всех наборах, поэтому, если пересечение относительно небольшое, оно может быть быстрым.
Затем вместо этого сохраните пересечение в std::vector<int>
- вставка с использованием push_back
также очень быстрая.
Вот еще один альтернативный метод
Измените наборы чисел на std::vector<int>
и используйте std::sort
для сортировки от наименьшего к наибольшему. Затем используйте std::binary_search
, чтобы найти значения, используя примерно тот же метод, что и выше. Это может быть быстрее, чем поиск по std::set
, так как массив более плотно упакован в памяти. На самом деле, не обращайте на это внимания, вы можете просто перебрать значения в шаге блокировки, просматривая значения с тем же значением , Увеличивайте только те итераторы, которые меньше минимального значения, которое вы видели на предыдущем шаге (если значения отличались).