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