簡體   English   中英

將DFA實現為鏈接列表的算法

[英]algorithm for implementing DFA as a linked list

我想知道如何在C / C ++ / Java中將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)對應的鄰接列表為:

1->2->3
2->1->3
3->3

ii)鄰接矩陣:這是一個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之類的庫,其中包含這兩個實現以及Dijkstra最短路徑算法的所有重要圖算法DFS。 您可以從http://www.boost.org/doc/libs/1_47_0/libs/graph/doc/index.html查找。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM