Menor NFA aceitando concatenações de duas palavras do comprimento

7

SejakN

Estou procurando uma compilação NFA pequena para a linguagem de concatenação de duas palavras do comprimento que são diferentes em termos de índice, ou seja,k

Lk={uvΣ:|u|=|v|=ki,uivi}

Observe que, como é fixo, , e é regular como idioma finito.k|Lk|=(|Σ|(|Σ|1))k

O DFA trivial para o idioma contém estados +1 e apenas "lembra" quais letras foram exibidas durante as primeiras k letras; no entanto, se k = o (| \ Sigma |) , podemos criar um NFA significativamente menor.k(|Σ|k)+1kk=o(|Σ|)

Um NFA "simples", pois seria do tamanho O(22k) (mais precisamente, O(k2log|Σ|22k+O(log2k)) ):

  1. Tome um conjunto universal (isto é, um conjunto de vetores modo que, para cada vetor e índices, existe um vetor tal que , ou seja, se olharmos apenas para esses índices em , encontraremos ). Tais famílias de tamanho são conhecidas.(|Σ|,2k)V{0,1}|Σ|u{0,1}2k2kvVv|I=ukvuO(22k)

    Pensamos em cada vetor como uma função , onde .vΣ{0,1}v(σi)=1vi=1

  1. Crie um NFA da seguinte maneira:

    1. A partir do estado inicial criar um -transition para um novo estado para qualquer . Denote esse estado por .q0ϵvVqv

    2. A partir de cada construa um caminho de estados que aceite todas as palavras cujas primeiras letras sejam mapeadas por a 0 e as últimas letras serão mapeadas por a 1.qvkvkv

Basicamente, a idéia é que o conjunto universal nos permita particionar as letras que podem aparecer nos primeiros símbolos do resto, e obtemos todas as palavras no idioma, pois deve haver um vetor correspondente que particiona corretamente.kvV

Então, as perguntas são:

Qual é o tamanho do menor NFA para ?L

Essa construção é ideal?

Qual limite inferior podemos provar para esse tamanho de autômato?

RB
fonte
algo relacionado computação NFAs mínimas de DFAs tcs.se
vzn
11
Obrigado @vzn. De fato, se minimização de tivesse sido solucionável em tempos poligonais, essa questão se tornaria inútil. Infelizmente, como é completo no PSPACE, precisamos trabalhar duro para criar pequenos NFAs para idiomas interessantes. DFANFA
RB
por que você diz que é "inútil" se estiver no PTime? para mim, isso apenas significaria que existe um algoritmo eficiente para isso. de qualquer maneira, isso parece bastante abstrato / teórico (à beira da pesquisa / Ciência da Computação Teórica ), tem mais bkg / motivação / aplicação?
vzn
@vzn - esse idioma é um caso especial de um idioma que eu uso para desenvolver algoritmos parametrizados para uma família de problemas de empacotamento. Ele usa um autômato para o idioma, além de restrições da entrada e verifica se o idioma está vazio. Não posso expandir muito o uso (como ainda é um trabalho em andamento), mas a diferença de letras basicamente garante que todos os itens não sejam embalados "muitas vezes". Simplifiquei o idioma o máximo possível, mas acredito que qualquer técnica usada para criar o NFA para me ajudaria a melhorar minha construção para o idioma real que estou usando. L
RB

Respostas:

4

Atualização: isso não responde à pergunta que o pôster original estava procurando e não ajuda no caso geral em que , portanto a pergunta permanece em aberto.|Σ|>2


Aqui está uma construção mais simples, mostrando que, no caso em que , declara suficiente, e na verdade você pode reconhecer o idioma com um DFA com esse muitos estados.Σ={0,1}O(k22k)

Vamos começar analisando o idioma do complemento:

Lk¯={uvΣ:|u|=|v|=k,i.ui=vi}.

Observe que isso pode ser reconhecido por um NFA comestados. O NFA adivinha primeiro um símbolo , depois aceita todas as cadeias onde .2k2|Σ|ixuvui=vi=x

Converta isso em um DFA usando a construção de subconjunto padrão. Obtemos um DFA com estados. Agora podemos calcular seu complemento, que é outro DFA com o mesmo número de estados que reconhece . Por ser um DFA, também é automaticamente um NFA.2|Σ|k+1 1keuk

Isso supera sua construção para o caso em que , mas, de outro modo, leva um NFA maior que o seu esquema. No entanto, pensei que poderia ser interessante, tanto porque é muito simples e porque na verdade fornece um DFA (não apenas um NFA) para reconhecer seu idioma .|Σ|=2euk

DW
fonte
Obrigado @DW pela resposta. É uma construção legal, mas na minha aplicação. k<<|Σ|
RB
@RB, OK, não há problema! Sua construção é melhor. Você pode editar sua pergunta para mencionar que em seu aplicativo. k|Σ|
DW