Эффективный алгоритм для преобразования набора символов в nfa / dfa

В настоящее время я работаю над генератором сканера. Генератор уже работает нормально. Но при использовании классов символов алгоритм становится очень медленным.

Генератор сканера производит сканер для файлов в кодировке UTF8. Полный диапазон символов (от 0x000000 до 0x10ffff) должен поддерживаться.

Если я использую большие наборы символов, как любой оператор '.' или свойство unicode {L}, nfa (а также dfa) содержит много состояний (> 10000). Таким образом, преобразование nfa в dfa и создание минимального dfa занимает много времени (даже если выходной минимальный dfa содержит только несколько состояний).

Вот моя текущая реализация создания части набора символов 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;
}

Кто-нибудь знает, как реализовать функцию гораздо эффективнее, чтобы создавать только необходимые состояния?

РЕДАКТИРОВАТЬ:

Чтобы быть более конкретным, мне нужна функция вроде:

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

Вспомогательная функция для преобразования символа (int) в байт кодировки UTF8 [] определяется как:

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

Ответы на вопрос(4)

Ваш ответ на вопрос