У меня большое количество идентификаторов пользователей (целых чисел), возможно, миллионов. Все эти пользователи принадлежат к разным группам (наборам целых чисел), таким образом, порядка 10 миллионов групп.
Чтобы упростить мой пример и разобраться в его сути, давайте предположим, что все группы содержат 20 идентификаторов пользователя.
Я хочу найти все пары целочисленных множеств, которые имеют пересечение 15 или больше.
Стоит ли сравнивать каждую пару комплектов? (Если я сохраню структуру данных, которая отображает идентификаторы пользователей для установки членства, в этом нет необходимости.) Какой самый быстрый способ сделать это? То есть, какой должна быть моя базовая структура данных для представления целочисленных наборов? Сортированные наборы, несортированные --- может ли хеширование как-то помочь? И какой алгоритм я должен использовать для вычисления пересечения множества)? Я предпочитаю ответы, которые касаются C / C ++ (особенно STL), но также приветствуются более общие алгоритмические идеи.
Обновление
Также обратите внимание, что я буду выполнять это параллельно в среде с общей памятью, поэтому предпочтительнее идеи, которые четко распространяются на параллельное решение.
Кроме того, обратите внимание, что подавляющее большинство пар множеств будет иметь размер пересечения 0 - это означает, что может быть выгодно использовать структуру данных, которая сопоставляет идентификаторы пользователей с наборами, чтобы избежать вычисления пересечения каждой пары. наборов.