Il y a vingt ans, j'ai construit un package d'expressions régulières qui comprenait des conversions d'expressions régulières vers une machine à états finis (DFA) et pris en charge une multitude d'opérations d'expressions régulières fermées (Kleene star, concatenation, reverse, set operations, etc.). Je n'étais pas sûr des performances les plus défavorables de mon colis.
Un DFA a le même pouvoir expressif qu'un NDFA, car un NDFA à n états peut être converti trivialement en un DFA ayant 2 ^ n états. Cependant, existe-t-il des garanties de limite supérieure inférieures pour une telle conversion qui ne nécessitent pas une explosion exponentielle en état?
Je n'ai pas été en mesure de trouver des exemples d'expressions régulières ou NDFA se comportant mal, mais je n'ai pas passé beaucoup de temps à y penser. Je devine une expression régulière comme (((((e | A | B | C) * (e | D | E | F)) * (e | G | H | I)) * (e | J | K | L | M)) * qui mélange beaucoup d'alternances et les étoiles Kleene auraient un NDFA de taille linéaire mais un DFA expansif.
la source
Réponses:
Il est connu que pour chaque paire de nombres naturels
n,a
tels quen <= a <= 2^n
, il existe un NDFA minimal avec desn
états dont le dfa minimal équivalent correspondant a desa
états (sur un alphabet à quatre lettres).Voir l'article ici: explosions déterministes d'automates finis non déterministes minimaux sur un alphabet fixe .
Résumé de l'article:
Donc, je suppose que la réponse à votre question est non.
la source
L'exemple classique d'un langage avec une séparation exponentielle entre la taille DFA et la taille NFA est le langage fini suivant: des chaînes binaires de longueur exactement 2n dans lesquelles la première moitié n'est pas égale à la seconde moitié. Un NFA devinerait un indice i dans lequel la première et la seconde moitié sont en désaccord. Une limite inférieure pour un DFA découle de la complexité de la communication, par exemple.
la source
Le DFA minimum correspondant à un NFA a 2 ^ n états dans le pire des cas, vous ne pouvez donc rien garantir. Sans avoir un exemple constructif, le raisonnement est que dans un NFA, vous pouvez être dans n'importe quel sous-ensemble arbitraire d'états après avoir lu une certaine chaîne d'entrée, et chacun de ces sous-ensembles peut se comporter différemment lors de l'observation d'un caractère. Supposons une langue avec deux caractères dans l'alphabet (a et b) et un NFA N avec n états commençant par un état acceptant à s_0. Énumérer maintenant tous les sous-ensembles d'états de N, et construire la table de transition de telle sorte que l'observation "a" du sous-ensemble S_i vous amène au sous-ensemble S_i + 1 et l'observation de b vous amène au sous-ensemble S_i-1 (c'est faisable pour certaines énumérations, je pense que ). Maintenant, ces automates ont n états et acceptent des séquences de ma et de nb telles que mn = 0 mod 2 ^ | N |, et ne peut pas être exprimé avec un DFA qui a moins de 2 ^ | N | États (car il peut être nécessaire de parcourir tous les sous-ensembles d'états du NFA N).
la source