Esta no es una respuesta. Es una observación simple pero larga. Espero que te sea útil.
La versión de decisión de su problema es: ¿ contiene un subconjunto de ?AXA
Este problema está relacionado con el problema de evaluar funciones booleanas monótonas de variables. Un subconjunto de es equivalente a una -bitstring, por lo que la familia es equivalente a una función booleana de variables. Dada una función , se puede definir la función menos monótona que no sea mayor que , es decir, . El problema original se reduce a la evaluación de . Por el contrario, el problema de evaluar una función booleana monótona puede reducirse al problema original, ya sea ingenuamente tomando{ 1 , ... , n } n X f n f f g ( y ) = ( ∃ x ⊆ y ,n{1,…,n}nXfnffg ( A ) f = g f Xg(y)=(∃x⊆y,f(x))g(A)f=go eligiendo una que haga más pequeña.fX
En la práctica, los BDD tienden a funcionar bien. Entonces, un enfoque posible es construir el BDD para , derivar de él el BDD para luego evaluar . El tamaño promedio de la BDD para debe ser , porque hay muchas funciones booleanas monótonas . Por lo tanto, en teoría, esta es una mala solución.g g gfgggΩ((nn/2))
Pero (1) podría ser posible un mejor análisis y (2) podría haber ajustes en este enfoque que lo hagan mejor. Por ejemplo, no utilicé de ninguna manera la correlación entre el tamaño de y el tamaño de BDD de . (Debe haber una correlación, pero no sé si es simple o utilizable aquí).Xg
Para completar, un algoritmo simple para calcular el BDD para desde el BDD para es el siguiente.
Aquí es la operación estándar en BDD.gf
m(x?f1:f0)=x?(m(f0)∨m(f1)):m(f0)
∨
Quizás pueda utilizar una técnica de "recuperación de información": en la fase de preprocesamiento, cree un índice invertido (en su caso, una simple matriz bidimensional es suficiente) que mapea un elemento a los conjuntos en que lo contienen: .n×|X| xi∈{1,...,n} X inv(xi)={Xj∈X|xi∈Xj}
Configure una matriz entera de longitud.occ |X|
Luego, por cada recupera , y por cada hazyi∈A inv(yi) Xj∈inv(yi) occ[j]=occ[j]+1
Al final, los conjuntos que necesita son aquellos para los cuales .|Xj|=occ[j]
Puede acelerar arbitrariamente el proceso (a costa del espacio exponencial) indexando dos o más elementos juntos.
fuente