Это не ответ. Это простое, но длительное наблюдение. Надеюсь это будет полезно.
Вариант решения вашей проблемы: содержит ли подмножество ?XA
Эта проблема связана с проблемой оценки монотонных булевых функций от переменных. Подмножество эквивалентно битной строке, поэтому семейство эквивалентно булевой функцииn{1,…,n}nXf от переменных. Для данной функции можно определить наименьшую монотонную функцию, которая не больше , а именно . Исходная задача затем сводится к оценке . И наоборот, проблема оценки монотонной булевой функции может быть сведена к исходной задаче, либо наивно, если взятьnffg(y)=(∃x⊆y,f(x))g(A)f=gили выбрав который делает меньше.fX
На практике BDD имеют тенденцию работать хорошо. Таким образом, одним из возможных подходов является создание BDD дляf , извлечь из него BDD для и затем оценить . Средний размер BDD для должен быть , поскольку существует много монотонных булевых функций . Следовательно, в теории это плохое решение.gggΩ((nn/2))
Но (1) возможен более качественный анализ и (2) могут быть изменения в этом подходе, которые делают его лучше. Например, я никоим образом не использовал корреляцию между размером и размером BDD . (Должна быть корреляция, но я не знаю, является ли она простой или пригодной для использования здесь.)Иксг
Для полноты простой алгоритм для вычисления BDD для из BDD для является следующим.
Здесь - стандартная операция or для BDD.ге
м ( х ?е1:е0) = х ? ( м (е0) ∨ м (е1) ) : м (е0)
∨
Возможно, вы можете использовать метод «поиска информации»: на этапе предварительной обработки построить инвертированный индекс (в вашем случае простойn × | Икс| достаточно двумерного массива), который отображает элемент Икся∈ { 1 , . , , , n } к наборам в Икс которые содержат это: ян V (Икся) = {ИксJ∈ X|Икся∈ИксJ} ,
Установить целочисленный массиво с с длины | Икс| ,
Тогда для каждогоYя∈ A извлекать я н V (Yя) и для каждого ИксJ∈ i n v (Yя) делать o c c [ j ] = o c c [ j ] + 1
В конце концов, вам нужны те наборы, для которых|ИксJ| =occ[j] ,
Вы можете произвольно ускорить процесс (за счет экспоненциального пространства) путем индексации двух или более элементов вместе.
источник