我正在開始編寫Java庫來實現高性能有限狀態機。 我知道這裏有很多庫,但我想從頭開始編寫自己的庫,因爲幾乎所有的庫都構造了自動優化,以便一次只處理一個庫。用Java設計高性能狀態機
我想知道SO社區中涉足狀態機設計的人員在實現像這些高性能庫時最重要/最好的設計原則。
思考
- 生成的自動機通常不龐大。 (〜100-500州)。
- 雖然實施應該能夠規模。
- 執行應該啓用快速轉換(最小化,確定等)。
- 希望實現DFA,NFA,GNFA,PDA和可能的樹自動機。如果可能的話,希望在單個界面下。
- 內存使用和性能之間應該有一個很好的平衡。
對於目前的設計對我來說現在的問題是:
應爲
State
,Symbol
和Transition
類來定義?或者應該使用「隱藏的」內部結構。就我個人而言,我認爲使用類將會浪費大量的內存,因爲相同的信息可以以更簡潔的形式存儲。但是,這是否能夠實現更快的轉換?它是否有其他優點/缺點?內部存儲數據的最佳方式是什麼?使用像
HashMap
和HashSet
這樣的數據結構可以實現分攤的恆定時間查找,但是會涉及一些開銷。這是最好的方法嗎?將轉換信息存儲爲原始(或不存在)數組似乎浪費了相當多的內存。特別是當圖書館需要一次處理大量的自動機時。不同數據結構的優缺點有哪些?
我很欣賞任何輸入。謝謝!
嗨,也許你可以使用我的教授實施作爲參考。它是基於DFA和NFA的開放源代碼。實施:http://www.brics.dk/automaton/性能基準:http://tusker.org/regex/regex_benchmark.html – 2011-03-12 10:57:26
@lasseespeholt - 大聲笑,我其實已經有代碼,我正在通過它。它是我發現的實際處於活躍開發階段的唯一Java庫之一。向我的教授表示感謝和問候! – 2011-03-12 11:03:12
你有沒有想過在Drools中使用有狀態規則會話? – 2011-03-12 12:50:27