У меня есть набор из N
элементов, которые являются наборами целых чисел, предположим, что он заказан и называет его I[1..N]
. Учитывая набор candidate
, мне нужно найти подмножество I
, у которых есть непустые перекрестки с candidate
.Что такое структура данных для быстрого поиска непустых пересечений списка множеств?
Так, например, если:
I = [{1,2}, {2,3}, {4,5}]
Я ищу, чтобы определить valid_items(items, candidate)
, такие, что:
valid_items(I, {1}) == {1}
valid_items(I, {2}) == {1, 2}
valid_items(I, {3,4}) == {2, 3}
Я пытаюсь оптимизировать для одного заданного множества I
и переменную candidate
наборы. В настоящее время я делаю это путем кэширования items_containing[n] = {the sets which contain n}
. В приведенном выше примере, который был бы:
items_containing = [{}, {1}, {1,2}, {2}, {3}, {3}]
То есть, 0, содержится в каких-либо предметов, 1 содержится в пункте 1, 2 содержится в Itmes 1 и 2, 2 содержится в пункте 2, 3 содержится в пункте 2, а 4 и 5 содержатся в пункте 3.
Таким образом, я могу определить valid_items(I, candidate) = union(items_containing[n] for n in candidate)
.
Есть ли более эффективная структура данных (разумного размера) для кэширования результата этого объединения? Очевидный пример пространства 2^N
неприемлем, но N
или N*log(N)
будет.