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