Если у меня есть переменное число множеств (пусть вызывается число n), у которых не более m элементов каждый, то какой наиболее эффективный способ вычисления попарных пересечений для всех пар множеств? Заметим, что это отличается от пересечения всех n наборов.
Например, если у меня есть следующие наборы:
A={"a","b","c"}
B={"c","d","e"}
C={"a","c","e"}
Я хочу найти:
intersect_AB={"c"}
intersect_BC={"c", "e"}
intersect_AC={"a", "c"}
Другим приемлемым форматом (если это станет проще) будет карта элементов в заданном наборе для наборов, содержащих этот же элемент. Например:
intersections_C={"a": {"A", "C"},
"c": {"A", "B", "C"}
"e": {"B", "C"}}
Я знаю, что одним из способов сделать это было бы создание словаря, сопоставляющего каждое значение в объединении всех n наборов с списком наборов, в которых оно происходит, и затем повторять все эти значения для создания списков, таких как intersections_C
выше, но я не уверен, как это масштабируется с ростом n, а размеры набора становятся слишком большими.
Дополнительная дополнительная информация:
- Каждый из наборов имеет примерно одинаковую длину, но также очень велик (достаточно большой, чтобы хранить их все в памяти, представляет собой реалистичную проблему, и алгоритм, который избегает этого, был бы предпочтительным, хотя и не нужен).
- Размер пересечений между любыми двумя наборами очень мал по сравнению с размером самих наборов
- Если это помогает, мы можем предположить все, что нам нужно, относительно упорядочения входных множеств.