Quel est le moyen le plus rapide de vérifier l'inclusion d'un ensemble?

24

Étant donné sous-ensembles de .nS1,,Sn{1,,d}

Vérifiez s'il existe des ensembles avec . (Si oui, trouvez un exemple, sinon, dites simplement «non»)Si,SjSiSj

La solution triviale à ce problème passe par toutes les paires d'ensembles et vérifie l'inclusion d'une paire dans le temps O(d) , donc le temps d'exécution global est O(n2d) . Ce problème peut-il être résolu plus rapidement? Y a-t-il un nom pour cela dans la littérature?

Karl
la source

Réponses:

27

Vous ne pouvez pas le résoudre en temps O(n2ϵ) pour une constante ϵ>0 sauf si l' hypothèse de temps exponentiel fort est fausse.

Autrement dit, si nous avions un tel algorithme, nous pourrions résoudre une satisfaction CNF à n variables en temps O((2ϵ)n) pour un certain ϵ>0 . La raison en est que nous pourrions diviser les variables en deux parties égales P1 et P2 de n/2 variables chacune. Pour chaque partie on construit une famille F1 et F2 respectivement de sous-ensembles des clauses de la manière suivante. Pour chaque affectation, nous ajoutons un sous-ensemble composé des clauses non satisfaites par l'affectation. Cette construction s'exécute en temps poly(n)2n/2 .

Pour terminer la construction, nous notons que l'instance CNF d'origine a une solution ssi il y a un sous-ensemble dans F1 qui est disjoint à un sous-ensemble dans F2 .

En ajoutant des éléments supplémentaires à votre ensemble de terrain en plus de ceux de chaque clause, il n'est pas trop difficile d'incorporer ce problème de disjonction comme une question d'inclusion d'ensemble. Vous prenez essentiellement les compléments des sous-ensembles dans . Pour vous assurer que deux ensembles dans ne sont pas comptés comme une inclusion, vous ajoutez un code d'une anti-chaîne sur les éléments supplémentaires. Un autre code anti-chaîne (sur d'autres éléments supplémentaires de l'ensemble de masse) est utilisé sur les sous-ensembles de pour s'assurer qu'aucune paire de sous-ensembles de forme une inclusion. Enfin, tous les ensembles formés à partir de comprennent tous les éléments des codes anti-chaîne de .F1F1F2F2F1F2

Il s'agit d'une question d'inclusion d'ensemble sur sous-ensembles sur un ensemble de masse . L'argument remonte essentiellement à un des premiers articles de Ryan Williams (je ne me souviens plus lequel).2n/2+1d=poly(n)

Andreas Björklund
la source
Merci beaucoup pour la réponse rapide. Nous avons même , si nous utilisons d'abord le lemme de sparsification, non? d=O(n)
Karl
9

Si vous êtes intéressé par les familles d'ensembles avec , alors une autre solution conceptuellement très similaire à celle décrite dans la réponse de Yuval est de calculer la transformation zêtan=ω(2d/2)

fζ(T)=STf(S),

où est la fonction d'indicateur de la famille d'entrée . Autrement dit, si et sinon. Il existe clairement des ensembles tels que si et seulement si pour certains .f:2[d]RF={S1,S2,,Sn}f(S)=1SFf(S)=0SiSjSiSjfζ(S)>1SF

La transformée zêta peut être calculée dans le temps utilisant l'algorithme de Yates, voir par exemple TAOCP de Knuth, vol. 2, §4.6.4. L'algorithme lui-même est une programmation dynamique assez simple, et il est facile de le modifier pour donner un exemple d'un ensemble inclus s'il en existe un.O(d2d)

Janne H. Korhonen
la source
C'est beaucoup plus simple que ma réponse!
Yuval Filmus
8

Ce problème peut être résolu en utilisant un algorithme de multiplication matricielle rapide, et je soupçonne également qu'il est équivalent sur le plan informatique à la multiplication matricielle (bien que je ne connaisse aucun moyen de le prouver, et je ne pense pas que des techniques pour le prouver existent ). Cette solution aurait un temps d'exécution de O (n ^ {2.373}) lorsque n = d, et d'autres temps d'exécution pour d'autres relations entre d et n.

Voici comment vous le résolvez en utilisant la multiplication matricielle: vous écrivez les vecteurs caractéristiques des ensembles dans les rangées d'une matrice n par d A, et les vecteurs caractéristiques des compléments des ensembles dans les colonnes de ad par n matrice B. Vous multipliez ensuite A par B. Les paires d'ensembles qui se croisent sont exactement les emplacements du produit A * B qui sont égaux à zéro.

Pour la meilleure durée de fonctionnement connue pour ce problème, voir l'article de Huang et Pan sur le sujet. Si je me souviens bien, lorsque d devient suffisamment grand, le temps de fonctionnement deviendra l'O (nd) évidemment optimal. Pour n = d, vous aurez un temps d'exécution de O (n ^ {2.373}). Pour les autres relations de n et d, vous obtiendrez d'autres valeurs. Si un algorithme optimal pour la multiplication de matrice rectangulaire existe, vous obtiendrez un algorithme avec le temps d'exécution O (n ^ 2 + nd) pour votre problème. Je soupçonne qu'il n'y a pas de meilleur moyen que celui-ci pour résoudre votre problème, mais je suis loin d'être sûr.

Cette solution n'est probablement pas d'une utilité pratique, car les constantes de ces algorithmes sont trop grandes. L'algorithme de Strassen pourrait apporter une amélioration par rapport à la solution naïve pour des valeurs raisonnables de n et d, mais je n'en suis même pas sûr. Cependant, les problèmes qui semblent si liés à la multiplication matricielle semblent rarement avoir des algorithmes combinatoires qui sont meilleurs que l'algorithme naïf (par plus de facteurs polylogarithmiques), donc si je devais deviner, je suppose qu'il n'y a pas de bon algorithme pour votre problème qui est nettement meilleure que la naïve, en utilisant les techniques actuelles.

Elad
la source
6

Si alors nous savons que l'ensemble n'est pas une antichaine par le lemme de Sperner, et donc le la version de décision du problème devient triviale. Mais il pourrait être intéressant de considérer le cas où est proche de cette valeur.n>(dd/2)2dπd/2n

Les travaux de Friedgut sur le théorème d'Erdős-Ko-Rado montrent que, étant donné le vecteur caractéristique d'une famille de sous-ensembles de , on peut trouver dans le temps si est une famille qui se recoupe (tous les deux éléments de couper). Plus généralement, sa méthode nous permet de calculer où est une fonction connue (spécifique) qui n'est pas zéro uniquement si sont disjoints. ne dépend que de l'histogramme de , où est l'indicateur de .f[m]O(m2m)ff

Σ=x,yfS(x,y),
S(x,y)0x,yS(x,y){(xi,yi):i[d]}xiix

(En passant, nous commentons que sa méthode fonctionne également si on nous donne deux familles et que nous sommes intéressés par . dans les deux cas, nous devons calculer les transformées de Fourier-Walsh à biais de pour un arbitraire , puis , où ne dépend que du poids de Hamming de .)f,gΣ=xf,ygS(x,y)pf,gp(0,1/2)Σ=xT(x)f^(x)g^(x)T(x)x

Comment tout cela est-il lié au problème actuel? Considérons la famille Chaque est disjoint de chaque . Puisque est donné explicitement, nous pouvons calculer la contribution de ces paires à . Y a-t-il d'autres paires disjointes? Si est de alors et donc . Donc est un antichain iff

F={Si{x}:i[n]}{Si¯{y}:i[n]}.
Si{x}Si¯{y}S(x,y)ΣSi{x}Sj¯{y}SiSj¯=SiSjS1,,Sn
Σ=i=1nS(Si{x},Si¯{y}).

Cet algorithme s'exécute dans le temps , en ignorant les facteurs polynomiaux en . Lorsque est proche de , c'est nettement mieux que . En général, nous obtenons une amélioration tant que .O~(n+2d)dn2dO~(n2)n=ω(2d/2)

Étant donné que nous savons qu'il existe une paire satisfaisant , comment la trouver? Supposons que nous divisions tous les ensembles en deux groupes au hasard. Avec une probabilité d'environ , les ensembles et se retrouveront dans le même groupe. Si nous sommes si chanceux, nous pouvons exécuter notre algorithme sur et , trouver à qui appartiennent-ils, et ainsi diviser par deux le nombre d'ensembles que nous devons considérer. Sinon, nous pouvons réessayer. Cela montre qu'avec un nombre attendu d' appels oracle à la version de décision, nous pouvons réellement trouver une paire satisfaisant .SiSjS1,,SnG1,G21/2SiSjG1G2O(logn)SiSj

Nous pouvons également dérandomiser l'algorithme. Sans perte de généralité, supposons . À chaque étape, nous partitionnons en fonction de chacun des bits. Une de ces partitions mettra toujours et dans la même partie, sauf si elles ont des polarités opposées; nous pouvons tester cela explicitement en utilisant uniquement des opérations . Cela donne un algorithme déterministe utilisant appels oracle à la version de décision.n=2kkxyO(nd)O(log2n)

Yuval Filmus
la source
Intéressant. Que dois-je lire si je veux en savoir plus à ce sujet?
Janne H. Korhonen
2
Consultez l'article de Friedgut "Sur la mesure des familles qui se croisent, l'unicité et la stabilité".
Yuval Filmus