Como visto nesta faixa recente do XKCD e nesta postagem recente no blogde Peter Norvig (e uma história do Slashdot com o último), "regex golf" (que pode ser chamado de problema de separação de expressões regulares) é o quebra-cabeça de definir a expressão regular mais curta possível que aceita todas as palavras do conjunto A e nenhuma palavra no conjunto. o post do conjunto B. Norvig inclui um algoritmo para gerar um candidato razoavelmente curto, e ele observa que sua abordagem envolve a solução de um problema NP-Set Set Cover, mas também é cuidadoso em ressaltar que sua abordagem não considera todas as expressões regulares possíveis, e, é claro, ele não é necessariamente o único algoritmo; portanto, não é garantido que suas soluções sejam ótimas, e também é possível que algum outro algoritmo de tempo polinomial com certeza possa encontrar soluções equivalentes ou melhores.
Por uma questão de concretude e para evitar ter que resolver a questão da otimização, acho que a formulação mais natural da Separação por Expressão Regular seria:
Dado dois conjuntos (finitos) e B de strings sobre algum alfabeto Σ , existe uma expressão regular de comprimento ≤ k que aceita todas as strings de A e rejeita todas as strings de B ?
Sabe-se alguma coisa sobre a complexidade desse problema específico de separação? (Observe que desde que eu especifiquei e B como conjuntos finitos de cadeias, a noção natural de tamanho para o problema é o comprimento total de todas as cadeias em A e B ; isso substitui qualquer contribuição de k ). Parece-me altamente provável que seja NP-completo (e, de fato, eu esperaria que a redução fosse para algum tipo de problema de cobertura), mas algumas pesquisas não revelaram nada particularmente útil.
fonte
Respostas:
Assumindo a variante TCS do regex, o problema é realmente NP-complete.
Assumimos que nossas expressões regulares contêm
e nada mais. O comprimento de uma regex é definido como o número de caracteres de . Como na história em quadrinhos, consideramos um regex para corresponder a uma palavra, se corresponder a uma substring da palavra. (Alterar qualquer uma dessas suposições deve influenciar apenas a complexidade da construção abaixo, mas não o resultado geral.)Σ
Para mostrar a dureza NP, reduzimos a tampa do conjunto:
Traduzimos uma entrada para Set cover em uma para regex golf da seguinte maneira:
Essa redução está obviamente em P e a equivalência também é bastante simples de ver:
fonte