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