我想知道如何在C/C++/Java中將DFA實現爲鏈接列表。將DFA作爲鏈表執行的算法
回答
因爲每個州可以有多個分支,您可能需要多個鏈接列表。這意味着,每個狀態都有一個n個鏈接列表。所以它更像是一個具有循環的樹結構而不是簡單的鏈表。
這是絕對有可能的,但是會非常低效。你要做的只是將所有狀態存儲在鏈接列表中,然後每個狀態都需要保留一個轉換表。轉換表看起來是這樣的:
'a' -> 2
'b' -> 5
您的字母是{a,b}
,以及2和5存儲在鏈接的列表中的位置2和5的狀態。正如我所說的,這絕對不是您想要實現DFA的方式,但它是可能的。
,在我的腦海裏想出的第一件事是,
創建一個類/結構稱爲狀態有兩個陣列組件。一個是可以到達我們州的州,另一個是從我們州到達的州。 然後創建一個鏈接列表,其元素是您的狀態。
,這裏是我實現這個類
class state
{
private:
string stateName;
vector<state> states_before_me;
vector<state> states_after_me;
state* next;
//methods of this state
}
單鏈表不能有效代表DFA的。您可以將DFA視爲有向加權圖數據結構,因爲狀態是頂點,過渡是邊,過渡符號是權重。有兩種主要的方法來實現圖結構。
i)鄰接表:它基本上有V(頂點數)鏈表。每個鏈接列表包含具有對應頂點的邊的頂點。如果我們有頂點(1,2,3)
和邊緣(1,2),(1,3),(2,1),(2,3),(3,3)
對應adjanceny列表是:
1->2->3
2->1->3
3->3
ⅱ)鄰接矩陣:這是一個VXV矩陣與位於(i,j)的每個條目從i象徵的邊緣至j。上述同樣的例子表示如下(1表示有邊緣,0意味着沒有):
1 2 3
1 0 1 1
2 1 0 1
3 0 0 1
但是因爲你的圖進行加權,你必須做出一點改變這些。
對於列表實現,您可以將鏈接列表中的頂點更改爲包含頂點和連接這些頂點的邊的權重的結構。
對於矩陣實現,您可以將權重直接放入矩陣而不是0.1值。
如果你不想處理圖類的實現,有像Boost Graph Library這樣的庫包含兩個實現和所有重要圖算法DFS到Dijkstra的最短路徑算法。你可以從http://www.boost.org/doc/libs/1_47_0/libs/graph/doc/index.html查找它。
- 1. DFA Minimization Brzozowski算法
- 2. NFA到DFA算法
- 3. 將字符集轉換爲nfa/dfa的高效算法
- 4. 在執行lex時將多個正則表達式轉換爲DFA
- 5. Hopcroft的算法 - DFA最小化
- 6. 從DFA中提取語言的算法
- 7. 將NFA轉換爲DFA
- 8. 將PDA轉換爲DFA
- 9. 將nfa轉換爲dfa
- 10. 執行鏈接表
- 11. QuickSort算法天真的執行..但它爲什麼不工作?
- 12. 要執行此操作,將需要哪種算法?
- 13. 將表作爲參數並執行連接的表值函數
- 14. 執行數組計算的Pythonic算法
- 15. 無法格式化節點'鏈接'作爲SQL執行
- 16. 將列表中的值替換爲數字,然後執行算術計算
- 17. 執行動作鏈的方法不起作用
- 18. clisp執行quickperm算法
- 19. 執行遞歸算法
- 20. PHP的GridView表,而行作爲鏈接
- 21. DFA包含1101作爲一個子
- 22. 鏈接列表執行
- 23. f#鏈表執行記錄
- 24. 執行隊列鏈表
- 25. DFA代表密碼
- 26. 如何將NFA/DFA轉換爲java?
- 27. 如何將DFA轉換爲圖靈機?
- 28. 作爲值的哈希表的可執行方法
- 29. NFA轉換爲DFA
- 30. 如何線性語法轉換爲DFA