Если у меня есть переменное число наборов (назовём число п), которые имеют самое м элементов каждый, что является самым эффективным способом для вычисления попарных пересечений для всех пар наборы? Обратите внимание, что это отличается от пересечения всех n наборов.Pairwise Set Пересечения в Python
Например, если у меня есть следующие наборы:
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"}}
Я знаю, что один из способов сделать это было бы создать словарь отображения каждого значение в объединении всех п множеств в список наборов, в которых это происходит, а затем перебирать все эти значения для создания списков, таких как intersections_C
выше, но я не уверен, как это масштабируется как n увеличивается, и размеры набора становятся слишком большими.
Некоторые дополнительные справочная информация:
- Каждое из множеств имеют примерно одинаковую длину, но и очень большой (достаточно большим, чтобы хранить их в памяти реалистическое беспокойство, и алгоритм, который позволяет избежать что было бы предпочтительным, хотя это и не обязательно)
- Размер пересечений между любыми двумя наборами очень мал по сравнению с самими размерами множеств
- Если это помогает, мы можем предположить все, что нам нужно, относительно порядка наборы ввода.
Вы пробовали метод, который, как вы знаете, работает? –
Я бы предложил следующее: Пройдите все наборы и постройте карту, отслеживая, где вы найдете каждый элемент. Это O (NlogN) (при условии, что словарь добавляет логарифмические служебные данные), где N - общее количество элементов. – nickie
Я пробовал метод, который я описал на небольших образцах, но проблема в том, что многие данные, которые я буду использовать с этим, будут загружены пользователем. Я бы идеально хотел, чтобы иметь возможность поддерживать гораздо большие варианты использования, поэтому мне было интересно, есть ли более общий/эффективный способ сделать это, чем наивный подход, который я описал. – ankushg