Я начинаю писать библиотеку Java для реализации высокопроизводительных конечных автоматов. Я знаю, что существует множество библиотек, но я хочу написать свою собственную с нуля, поскольку почти все библиотеки создают автоматы, оптимизированные для обработки только по одному за раз.
Я хотел бы знать, что люди в сообществе SO, которые пробовали заниматься проектированием конечных автоматов, считают наиболее важными / лучшими принципами проектирования, когда речь идет о реализации подобных высокопроизводительных библиотек.
Соображения
Текущие вопросы относительно дизайна для меня:
Следует ли определять классы для состояния
, символа
и перехода
? Или следует использовать «скрытую» внутреннюю структуру. Лично я считаю, что использование классов как таковых приведет к потере большого количества памяти, поскольку ту же информацию можно сохранить в гораздо более сжатой форме. Но позволяет ли это более быстрое преобразование? Есть ли другие плюсы / минусы?
Как лучше всего хранить данные внутри? Использование таких структур данных, как HashMap
и HashSet
, позволяет осуществлять поиск с амортизированным постоянным временем, но при этом возникает элемент накладных расходов. Это лучший способ? Хранение информации о переходах в виде примитивного (или нет) массива, похоже, тратит довольно много памяти. Особенно, когда библиотеке нужно обрабатывать много автоматов одновременно. Каковы плюсы и минусы различных структур данных?
Я ценю любой ввод. Спасибо!