私は、高性能の有限状態マシンを実装する Java ライブラリの作成を開始しようとしています。たくさんのライブラリがあることは知っていますが、ほとんどすべてのライブラリが一度に 1 つだけを処理するように最適化されたオートマトンを構築するため、ゼロから独自のライブラリを作成したいと考えています。
ステート マシンの設計に手を出した SO コミュニティの人々が、このような高性能ライブラリの実装に関して最も重要で最良の設計原則をどのように感じているかを知りたいです。
考慮事項
- 生成されるオートマトンは通常、大規模ではありません。(~ 100-500 州)。
- ただし、実装はスケーリングできる必要があります。
- 実装は、高速変換(最小化、決定化など) を有効にする必要があります。
- DFA、NFA、GNFA、PDA、およびおそらくツリー オートマトンの実装を検討しています。可能であれば、単一のインターフェースの下でうまくいけば。
- メモリ使用量とパフォーマンスのバランスが取れている必要があります。
現時点でのデザインに関する現在の質問は次のとおりです。
State
、Symbol
およびのクラスをTransition
定義する必要がありますか? または、「隠された」内部構造を使用する必要があります。個人的には、クラスをそのまま使用すると、同じ情報をより凝縮された形式で格納できるため、多くのメモリが浪費されると感じています。しかし、これはより速い変換を可能にしますか? 他に長所/短所はありますか?データを内部に保存する最良の方法は何ですか?
HashMap
およびのようなデータ構造を使用するとHashSet
、償却された一定時間のルックアップが可能になりますが、関連するオーバーヘッドの要素があります。これが最善の方法ですか?遷移情報をプリミティブ (またはそうでない) 配列として保存すると、かなりの量のメモリが浪費されるようです。特に、ライブラリが一度に多くのオートマトンを処理する必要がある場合。異なるデータ構造の長所と短所は何ですか?
ご意見をお待ちしております。ありがとう!