Допустим, у меня есть 4 разных значения A, B, C, D с прикрепленными наборами идентификаторов.
А = {1,2,3,4,5}
В = {8,9,4}
С = {3,4,5}
D = {12,8}
И учитывая набор S идентификаторов {1,30,3,4,5,12,8} Я хочу, чтобы он возвращал C и D. т.е. извлекал все наборы из группы наборов, для которых S является надмножеством.
Существуют ли алгоритмы для эффективного выполнения этой задачи (желательно с низкой сложностью памяти. Использование внешнего устройства для хранения данных не вариант)?
Тривиальным решением было бы для каждого члена в расширенном наборе S получить список наборов, которые включают этот элемент (в основном инвертированный индекс), и для каждого возвращенного набора проверить, что все его члены находятся в расширенном наборе. К сожалению, поскольку в среднем надмножество будет включать в себя хотя бы одного члена для каждого набора, при таком подходе будет существенное и недопустимое снижение производительности.
Я пытаюсь сделать это на Java. Набор состоит из целых чисел, и значение, которое они идентифицируют, является объектом.
Коллекция наборов не является статичной и должна меняться в процессе исполнения. Там будет некоторое ограничение на установленное количество, хотя.
Размер набора не ограничен. Но в среднем это от 1 до 20.