У меня есть набор 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 содержится в пунктах 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)
будут.