Algoritmo eficiente para converter um conjunto de caracteres em um nfa / dfa

Atualmente, estou trabalhando em um gerador de scanner. O gerador já funciona bem. Mas, ao usar classes de caracteres, o algoritmo fica muito lento.

O gerador do scanner produz um scanner para arquivos codificados em UTF8. O intervalo completo de caracteres (0x000000 a 0x10ffff) deve ser suportado.

Se eu usar conjuntos de caracteres grandes, como o operador any '.' ou a propriedade unicode {L}, o nfa (e também o dfa) contém muitos estados (> 10000). Portanto, a conversão de nfa para dfa e cria o mínimo dfa leva muito tempo (mesmo que o dfa mínimo de saída contenha apenas alguns estados).

Aqui está minha implementação atual de criação de um conjunto de caracteres parte do nfa.

void CreateNfaPart(int startStateIndex, int endStateIndex, Set<int> characters)
{
transitions[startStateIndex] = CreateEmptyTransitionsArray();
foreach (int character in characters) {
    // get the utf8 encoded bytes for the character
    byte[] encoded = EncodingHelper.EncodeCharacter(character);
    int tStartStateIndex = startStateIndex;
    for (int i = 0; i < encoded.Length - 1; i++) {
        int tEndStateIndex = transitions[tStartStateIndex][encoded[i]];
        if (tEndStateIndex == -1) {
           tEndStateIndex = CreateState();
               transitions[tEndStateIndex] = CreateEmptyTransitionsArray();
        }                   
        transitions[tStartStateIndex][encoded[i]] = tEndStateIndex;
        tStartStateIndex = tEndStateIndex;
    }
    transitions[tStartStateIndex][encoded[encoded.Length - 1]] = endStateIndex;
}

Alguém sabe como implementar a função com muito mais eficiência para criar apenas os estados necessários?

EDITAR:

Para ser mais específico, preciso de uma função como:

List<Set<byte>[]> Convert(Set<int> characters)
{
     ???????
}

Uma função auxiliar para converter um caractere (int) em um byte de codificação UTF8 [] é definida como:

byte[] EncodeCharacter(int character)
{ ... }

questionAnswers(4)

yourAnswerToTheQuestion