在 Java 中设计高性能状态机
我正在开始编写一个Java库来实现高性能的有限状态机。我知道那里有很多库,但我想从头开始编写自己的库,因为几乎所有的库都构建了针对一次只处理一个而优化的自动机。
我想知道在实现这样的高性能库时,SO社区中涉足状态机设计的人觉得最重要/最好的设计原则是什么。
考虑
- 生成的自动机通常不是巨大的。(约100-500个州)。
- 不过,实现应该能够扩展。
- 实现应实现快速转换(最小化、确定等)。
- 希望实现DFA,NFA,GNFA,PDA和可能的Tree Automata。如果可能的话,希望在单个界面下。
- 应该在内存使用和性能之间取得良好的平衡。
目前对我来说,目前关于设计的问题是:
是否应定义 和 的类?或者应该使用“隐藏”的内部结构。就个人而言,我觉得使用这样的类会浪费大量的内存,因为相同的信息可以以更精简的形式存储。但是,这是否能够实现更快的转换?它是否具有任何其他优点/缺点?
State
Symbol
Transition
在内部存储数据的最佳方式是什么?使用类似和的数据结构可以实现摊销的常量时间查找,但涉及到一个开销元素。这是最好的方法吗?将转换信息存储为原始(或非)数组似乎浪费了相当多的内存。特别是当库需要一次处理很多自动机时。不同数据结构的优缺点是什么?
HashMap
HashSet
我感谢任何投入。谢谢!