Laisser être un NFA acyclique.
Depuis est acyclique, est fini.
Pouvons-nous calculer en temps polynomial?
Sinon, pouvons-nous l'approcher?
Notez que le nombre de mots n'est pas le même que le nombre de chemins d'acceptation dans , qui est facilement calculable.
Permettez-moi de mentionner une approche évidente qui ne fonctionne pas: convertir le NFA en DFA (qui sera également acyclique), puis compter le nombre de chemins d'acceptation dans le DFA. Cela ne donne pas lieu à un algorithme polynomial, car la conversion peut provoquer une explosion exponentielle de la taille du DFA.
Réponses:
Voici une approche qui, je pense, devrait vous donner une approximation à facteur multiplicatif, avec un temps d'exécution polynomial.
LaisserL être une langue régulière qui est un sous-ensemble de {0,1}n , par exemple, L=L(M)∩{0,1}n . Nous allons essayer de calculer la taille approximative deL .
À un niveau élevé, notre approche pour|L| ressemblera à ceci:
Choisissez une fractionp , où 0<p<1 .
Choisissez une langue régulièreR de telle sorte qu'en gros, R est un sous-ensemble aléatoire de {0,1}n de taille environ p2n (c'est à dire, |R|≈p2n ).
Vérifier siL∩R n'est pas vide. Notez que cette vérification peut être effectuée en temps polynomial.
Effectuez à plusieurs reprises les étapes 1 à 3 pour différentes valeurs dep . Cela vous donne quelques informations qui vous permettront d'approcher|L| .
En particulier, si|L|=m , alors nous nous attendrions
Donc, si vous choisissez et répétez les étapes 1 à 3 plusieurs fois, vous devez vous attendre à voir une intersection vide environ 37% du temps. Si vous voyez une intersection vide beaucoup plus souvent que cela, augmentez et réessayez. Si vous voyez une intersection vide beaucoup moins souvent que cela, vous pouvez diminuer et réessayer.p=1/m p p
De cette façon, en utilisant quelque chose comme la recherche binaire, vous devriez pouvoir approximerà l'intérieur d'un facteur d'approximation multiplicatif.|L|
Vous devrez toujours choisir un moyen de choisir pour qu'il soit régulier mais se comporte également comme un sous-ensemble aléatoire. Il existe de nombreuses possibilités, mais une bonne façon pourrait être de choisir un hachage aléatoire universel 2 , choisissez au hasard et laissez . Choisir vous donne un ensemble aléatoire d'environ la bonne taille, et parce que est 2-universel, toutes les mathématiques ci-dessus devraient fonctionner correctement.R h:{0,1}m→{0,1,2,…,k−1} y∈{0,1,…,k−1} R={x∈{0,1}n:h(x)=y} k=⌈1/p⌉ R h
Cela devrait résoudre votre problème dans le cas où toutes les chaînes de la NFA ont la même longueur, disons . S'ils ont des longueurs variables, vous pouvez gérer chaque longueur possible séparément. Puisque est acyclique, les longueurs maximales de toute chaîne dans sont au plus le nombre d'états dans , donc cela n'augmente pas trop le temps d'exécution.n M L(M) M
(Cette construction pourrait vous rappeler le théorème de Vazirani-Vazirani sur la SAT sans ambiguïté.)
la source
Supposons que vous pouvez compter en temps polynomial le nombre de mots d'une langue donnée par un NFA acyclique. Dans ce cas, en considérant deux NFA acycliques et , vous pouvez calculer en temps polynomial le cardinal (resp. ) de la langue de (resp. ). Par un produit direct (préservant l'acyclicité) vous pouvez également calculer en temps polynomial le cardinal de l'intersection de ces deux langages. Les deux automates acceptent le même langage si . Par conséquent, vous pouvez tester l'égalité de deux langages finis donnés par les automates acycliques en polynôme, qui est connu pour être un problème NP-complet. Donc, à moins queA1 A2 n1 n2 A1 A2 n3 n1=n2=n3 P=NP , vous ne pouvez pas résoudre votre problème en temps polynomial.
la source