Итак, ваш пример коллекции может выглядеть так:
A { ss |-> 42, dl |-> 123 }
B { ss |-> 42, dl |-> 456 }
C { ss |-> 23, dl |-> 456 }
D { ss |-> 89, dl |-> 789 }
E { ss |-> 89, dl |-> 432 }
Тогда я бы предложил использовать алгоритм, в котором вы создаете несколько коллекций, постепенно объединяя или вставляя каждую коллекцию в несколько коллекций:
Итерация 1. Первая коллекция становится единственной мультиколлекцией:
{A} { ss |-> [42], dl |-> [123] }
Итерация 2. Объедините следующую коллекцию с первой, поскольку SSN уже существует:
{A,B} { ss |-> [42], dl |-> [123,456] }
Итерация 3. Слияние еще раз, поскольку DLN уже существует:
{A,B,C} { ss |-> [23,42], dl |-> [123,456] }
Итерация 4. Вставьте новую мультиколлекцию, поскольку нет совпадений:
{A,B,C} { ss |-> [23,42], dl |-> [123,456] }
{D} { ss |-> [89], dl |-> [789] }
Итерация 5. Объединение со вторым мультиколлекцией, поскольку там есть SSN:
{A,B,C} { ss |-> [23,42], dl |-> [123,456] }
{D,E} { ss |-> [89], dl |-> [432,789] }
Таким образом, в каждой итерации (по одной для каждой коллекции) вы должны идентифицировать все мультиколлекции, имеющие общие значения с коллекцией, которую вы обрабатываете, и объединить все вместе .
В общем случае, если существует n коллекций с постоянным числом атрибутов k, то этот алгоритм будет работать за время O (nnk) = O (n 2 ). Наихудшее поведение проявляется, если все значения атрибутов различны. Когда между значениями атрибутов больше общего доступа, время, необходимое для вставки и определения членства в наборах значений атрибута (например, [23,42]), становится доминирующим фактором, поэтому наборы значений атрибута должны быть эффективными.
Если вы используете оптимальные непересекающиеся множества , то каждая операция поиска или слияния будет выполняться за амортизированное время O (& alpha; (n)).
Таким образом, для каждой итерации будет не более n мультиколлекций (ситуация, когда мультиколлекции до сих пор не были объединены). Чтобы интегрировать новую коллекцию в мультиколлекции, вам нужно будет выполнить операцию Find для каждого из k наборов мультиколлекций, чтобы определить все мультиколлекции, которые нужно объединить, что занимает время, ограниченное O (nk & alpha; (n) ). Чтобы объединить не более k найденных мультиколлекций, этот путь требует O (k 2 & alpha; (n)).
Таким образом, для всей итерации время ограничено O (n (nk & alpha; (n) + k 2 & alpha; (n))) = O (n (nk & alpha; (n))) = O (n 2 k & alpha; (n)) = O (n 2 & alpha; (n)), поскольку k является константой.
Поскольку & alpha; (n) для всех практических целей также является константой, общее время ограничено O (n 2 ).