資源簡(jiǎn)介
用C語言實(shí)現(xiàn)NFA到DFA的轉(zhuǎn)換過程
NFA (nondeterministic finite-state automata)是不確定性有限狀態(tài)自動(dòng)機(jī)的簡(jiǎn)寫,NFA的定義為:
一個(gè)不確定性有限狀態(tài)自動(dòng)機(jī)由以下部分所組成:
A. 一個(gè)有限的輸入字符集I
B. 一個(gè)有限的狀態(tài)集S
C. 狀態(tài)轉(zhuǎn)換函數(shù)f: S x I -> P(S),P(S)為s的冪集
D. 一個(gè)結(jié)束狀態(tài)集Q,Q是S的子集
E. 一個(gè)初始狀態(tài)s0 (屬于S)
F. 表示為A(I, S, f, Q, s0)
與NFA相對(duì)應(yīng),DFA (deterministic finite-state automata)表示確定性有限狀態(tài)自動(dòng)機(jī)。與NFA不同,DFA不存在Epsilon轉(zhuǎn)換,并且每一個(gè)狀態(tài)轉(zhuǎn)換函數(shù)的值只對(duì)應(yīng)一個(gè)狀態(tài),即一個(gè)狀態(tài)輸入一個(gè)字符,只能有一個(gè)狀態(tài)相對(duì)應(yīng)。
NFA與DFA的區(qū)別
顯然,DFA更加適合我們進(jìn)行字符串匹配,因?yàn)檩斎胍粋€(gè)字符,總能從一個(gè)狀態(tài)確定地轉(zhuǎn)換為另一個(gè)狀態(tài),直到終結(jié)狀態(tài)。NFA一個(gè)輸入可能對(duì)應(yīng)多個(gè)狀態(tài),因此需要進(jìn)行回溯,先嘗試一條路徑,發(fā)現(xiàn)走不通,再回退到原來的狀態(tài)嘗試另外一條路徑,顯然匹配算法不如DFA簡(jiǎn)單。
給定一個(gè)NFA,總有一個(gè)DFA與之對(duì)應(yīng),即一個(gè)NFA可以轉(zhuǎn)換成一個(gè)等價(jià)的DFA,我們將使用子集構(gòu)造算法實(shí)現(xiàn)NFA到DFA的轉(zhuǎn)換。

代碼片段和文件信息
#include?
#include?
#include?
#define?MAX?10
#define?INFINIT?32767
#define?NumMaxChar?10
#define?NumMAXTN?10?
///////////////////////////////數(shù)據(jù)結(jié)構(gòu)定義//////////////////////////////////?
//////////////////////////NFA圖結(jié)構(gòu)//////////////////////////////////
typedef?struct?edge
{//邊
int?dest;
char?cost;
struct?edge?*link; //指向下一邊
}*Edge;?
typedef?struct?vertex
{//頂點(diǎn)
char?data; //狀態(tài)
Edge?adj; //邊
}*Vertex;?
typedef?struct?graph
{//圖
Vertex?NodeTable;
int?NumVertex;
int?MaxNumVertex;
int?NumEdge;
}*Graph;
//////////////////////////////////////////////////////////////////////
//////////////////////////狀態(tài)轉(zhuǎn)換表機(jī)構(gòu)//////////////////////////////
typedef?struct?tablenode
{//轉(zhuǎn)換表節(jié)點(diǎn)
char?newname;//新命名
char?ch[MAX];//頂點(diǎn)集合
}*TableNode;?
typedef?struct?tablequeue
{//轉(zhuǎn)換表列
TableNode?TN[MAX];//轉(zhuǎn)換表節(jié)點(diǎn)數(shù)組
char?transword;//轉(zhuǎn)換條件
int?NumTn;//添加的頂點(diǎn)數(shù)
}*TableQueue;?
typedef?struct?transmatrix
{//狀態(tài)轉(zhuǎn)換矩陣
TableQueue?TQ;//轉(zhuǎn)換表列組
int?transnum;//轉(zhuǎn)換表列數(shù)
}*TranMatrix;?
/////////////////////////////////////////////////////////////////////////////?
///////////////////////////////////圖操作////////////////////////////////////??
int?GraphEmpty(Graph?g)
{//圖判空
return?g->NumVertex==0;
}?
int?GraphFull(Graph?g)
{//判圖滿
return?g->NumVertex==g->MaxNumVertex;
}?
char?GetValue(Graph?gint?i)
{//尋找下標(biāo)為i的頂點(diǎn)
return?(i>0?&&?iNumVertex??g->NodeTable[i].data:‘?‘);
}
??
void?Insert_Vertex(Graph?gchar?vertex)
{//插入新的頂點(diǎn)
g->NodeTable[g->NumVertex].data=vertex;
g->NodeTable[g->NumVertex].adj=NULL;
g->NumVertex++;
}?
void?Insert_Edge(Graph?gint?v1int?v2char?weight)
{//插入邊
Edge?p;
p=(Edge)malloc(sizeof(struct?edge));
p->cost=weight;
p->dest=v2;
p->link=g->NodeTable[v1].adj;
g->NodeTable[v1].adj=p;?
}?
int?GetVertexPos(Graph?gchar?v)
{//得到頂點(diǎn)在圖中的下標(biāo)
int?i=0;
while(iNumVertex)
{
if(g->NodeTable[i].data==v)
return?i;
i++;
}
return?INFINIT;
}?
void?Construct_Graph(Graph?g)
{//創(chuàng)建圖
int?kjivexnedgen;
char?headtailname;
char?weight;
g->NumVertex=0;
g->NumEdge=0;
g->MaxNumVertex=MAX;
g->NodeTable=(Vertex)malloc((g->MaxNumVertex)*sizeof(struct?vertex));
printf(“輸入NFA狀態(tài)數(shù):“);
scanf(“%d“&vexn);
printf(“輸入NFA狀態(tài)名稱:\n“);
flushall();
//依次獲取狀態(tài)名稱,并將這些頂點(diǎn)插入圖中
for(i=0;i {??
scanf(“%c“&name);
flushall();
Insert_Vertex(gname);
}
????printf(“輸入NFA的邊數(shù):“);
????scanf(“%d“&edgen);
????printf(“輸入?起始狀態(tài),接受字符?和?到達(dá)狀態(tài):\n“);
????flushall();
//依次獲取邊的信息(起始頂點(diǎn),接受字符,到達(dá)的頂點(diǎn)),并將這些邊插入圖中
for(i=0;i {???
flushall();
scanf(“%c?%c?%c“&tail&weight&head);
k=GetVertexPos(gtail);
j=GetVertexPos(ghead);
Insert_Edge(gkjweight);
}
}?
void?Destruct_Graph(Graph?g)
{//銷毀圖??
int?i;
Edge?p;
for(i=0;iNumVertex;i++)
{
p=g->NodeTable[i].adj;
while(p!=NULL)
{
g->NodeTable[i].adj=p->link;
p->link=NULL;
free?(p);
p=g->NodeTable[i].adj;
}
}
g->N
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????9191??2008-11-27?20:02??aa.cpp
-----------?---------??----------?-----??----
?????????????????9191????????????????????1
評(píng)論
共有 條評(píng)論