nfa-dfa(NFA DFA).docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
nfa-dfa(NFA DFA)

nfa-dfa(NFA DFA) #包括文件 #包含iostream #包括记忆 #算法包括 #包括字符串 #包括 cmath #包括向量 #包括设置 使用名称空间; / * 从NFA - DFA 步骤: 1。将所有还未计算的集合计算完(初始时,讲开始点的所在集合设为未计算集合) 2。对于每个未计算的集合计算每条边(A,B),如果产生一个新的完全不同的集,就把他加入集合中。 3。如何计算一个新产生的集呢?按照E边扩展。 !!子集构造法按照书的P26,用栈来实现,队列其实也行,深搜也行 e-closure(E的闭包)计算按书上方法栈,floodfill方法也行 * / typedef int集 四; typedef int向量 VI; typedef对硅:迭代器,布尔 PI; 常量= 10000; 六克的[ ] [ 300 ];//克[我] [ J ]表示对于点我经过符号J到达的点,有向 int n = 0,M = 0;//点数,边的种类数 国际e_edge = 1;//记录E边的编号 字符边缘[ 300 ];//每个边的编号对应的字符 在原始的[ ];//对应的原编号 int v [ 300 ];//存某个字符是否用过,用过的话,就是它对应的标记号 int v2的[ ];//存某个数字是否用过,用过的话,就是它对应的标记号 起始; 六端; / /以下为保存DFA结果 INT [ 300 ]; 四RSET的[ ]; int N2;/ / N2集合数;边的种类数应该保持不变,除了E边 int头= 0;//起始和结束集合 六end2; 无效debug_show_set(Si和S) { 对于(硅:迭代器Si =美国begin();硅!= S();Si + +) cout *四”; } 无效inputing() /读入边,转化为矩阵 { int,a,b,r; ch; memset(V,1,sizeof(V)); memset(V2,1,sizeof(V2)); cout “边的数目:”;CIN R; 对于(i = 0;i;r;i +) { ; 如果(- 1) { 原来的; V2; } a [ V2 ]; 如果(- 1) { 原来的; V2; } B = V2; 如果(- 1 = { 边[ = ]; V=m + +; } 如果(CH =“e”) e_edge = V [CH]; CH=v [ CH ]; G [一] [(int)CH ] push_back(B); } cout “e_edge是“ e_edge endl;/ /调试 cout “起点”;CIN 开始; 启动=启动[开始]; cout “终点数目及各终点”;CIN 一; 对于(i = 0;i a;+ +) { CIN; B = V2; 最后push_back(B); } } 四e_closure(Si和S)/求的的E的闭包栈方法 { SI = s; SI::迭代器SI; int堆栈,顶部= 0; memset(栈,0,sizeof(堆栈)); (四=为美国begin();硅!= S();Si + +) { 堆栈[顶部+ +; } /开始堆栈 而(上) { 顶; int,j; j =堆栈[顶]; PI P1;/对类型,第二个参数是bool 为(i = 0;i G [ J ] [ e_edge ]。size();i++) { P1 = r.insert(G [ J ] [ e_edge ] [我]); 如果(p1.second = =真) { 栈[顶+ +] = G [ J ] [ e_edge ] [我]; } } } 返回R; } SI移动(SI和s), Int j j the number of edges) / / step { SI r; SI:: iterator, si; For (Si = s.begin (); Si; =s.end (); si++) For (int i=0 ig[*si J].size; []); (i++) { Int temp; Temp = g[*si][j][i]; R.insert (temp); } Return r; } Bool contain_end (const SI S) { Int i; For (i=0; iend.size (); i++) If (s.find (end[, I,)) = s.end () Return 1; Return 0; } Void, find_sub_set () { Int, stack[N], top; Memset (stack, 0, sizeof (stack)); Top = 0; SI temp; Temp.insert (start);

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档