Ce n'est pas une réponse. C'est une observation simple mais longue. J'espère que ce sera utile.
La version de décision de votre problème est la suivante: contient-il un sous-ensemble de ?AXA
Ce problème est lié au problème de l'évaluation des fonctions booléennes monotones de variables. Un sous-ensemble de est équivalent à une chaîne de bits, donc la famille est équivalente à une fonction booléenne de variables. Étant donné une fonction , on peut définir la fonction la moins monotone qui n'est pas plus grande que , à savoir . Le problème d'origine se réduit alors à évaluer . A l'inverse, le problème de l'évaluation d'une fonction booléenne monotone peut être réduit au problème d'origine, soit naïvement en prenant{ 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=gou en choisissant un qui rend plus petit.fX
Dans la pratique, les BDD fonctionnent généralement bien. Donc, une approche possible est de construire le BDD pour , d'en dériver le BDD pour , puis d'évaluer . La taille moyenne du BDD pour doit être , car il existe de nombreuses fonctions booléennes monotones . Par conséquent, en théorie, c'est une mauvaise solution.g g gfgggΩ((nn/2))
Mais (1) une meilleure analyse pourrait être possible et (2) il pourrait y avoir des ajustements à cette approche qui la rendent meilleure. Par exemple, je n'ai utilisé en aucune façon la corrélation entre la taille de et la taille du BDD de . (Il doit y avoir une corrélation, mais je ne sais pas si elle est simple ou utilisable ici.)Xg
Pour être complet, un algorithme simple pour calculer le BDD pour partir du BDD pour est le suivant.
Ici est l'opération standard ou sur les BDD.gf
m(x?f1:f0)=x?(m(f0)∨m(f1)):m(f0)
∨
Vous pouvez peut-être utiliser une technique de "récupération d'informations": dans la phase de prétraitement, créez un index inversé (dans votre cas un simple tableau bidimensionnel suffit) qui mappe un élément aux ensembles dans qui le contiennent: .n×|X| xi∈{1,...,n} X inv(xi)={Xj∈X|xi∈Xj}
Mettre en place un tableau d'entiers de longueur.occ |X|
Ensuite, pour chaque récupérez , et pour chaque ,yi∈A inv(yi) Xj∈inv(yi) occ[j]=occ[j]+1
À la fin, les ensembles dont vous avez besoin sont ceux pour lesquels .|Xj|=occ[j]
Vous pouvez accélérer arbitrairement le processus (au prix d'un espace exponentiel) en indexant deux ou plusieurs éléments ensemble.
la source