Я нахожусь в процессе написания библиотеки Java для реализации высокопроизводительных конечных автоматов. Я знаю, что существует множество библиотек, но я хочу написать свою собственную с нуля, поскольку почти все существующие библиотеки создают автоматы, оптимизированные для работы только по одному.
Я хотел бы знать, что люди в сообществе SO, которые занимались проектированием конечных автоматов, считают наиболее важными / лучшими принципами проектирования, когда дело доходит до реализации подобных высокопроизводительных библиотек.
Рекомендации
- Сгенерированные автоматы обычно не массивны. (~ 100-500 состояний).
- Однако реализация должна иметь возможность масштабирования.
- Реализация должна позволять быстрые преобразования (минимизация, детерминация и т. Д.).
- Планируется внедрить DFA, NFA, GNFA, PDA и, возможно, Tree Automata. Надеюсь, в рамках единого интерфейса, если это возможно.
- Должен быть хороший баланс между использованием памяти и производительностью.
Текущие вопросы относительно дизайна для меня:
Следует ли определять классы для
State
,Symbol
иTransition
? Или следует использовать «скрытую» внутреннюю структуру. Лично я считаю, что использование классов как таковых будет тратить много памяти, поскольку ту же информацию можно хранить в гораздо более сжатой форме. Но дает ли это возможность более быстрых преобразований? Есть ли другие плюсы / минусы?Как лучше всего хранить данные внутри? Использование таких структур данных, как
HashMap
иHashSet
, позволяет осуществлять поиск с амортизированной постоянной продолжительностью, но при этом возникает элемент накладных расходов. Это лучший способ? Хранение информации о переходах в виде примитивного (или нет) массива, похоже, тратит довольно много памяти. Особенно, когда библиотеке нужно обрабатывать много автоматов одновременно. Каковы плюсы и минусы различных структур данных?
Я ценю любой вклад. Спасибо!