DFA有限状态自动机.pptVIP

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
bool SearchDfa(char * s) { CNode * p = Tree + 1; for( int i = 0; s[i] ;i ++ ) { while(true) { if( p-pChilds[s[i]-a]) { p = p-pChilds[s[i]-a]; if( p-bStopNode ) return true; break; } else p = p-pPrev; } } return false; } int main() { nNodesCount = 2; int M,N; scanf(%d%d,N,M); //N个模式串,M个句子 for( int i = 0;i N; i ++ ) { char s[20]; scanf(%s,s); Insert(Tree + 1,s); } BuildDfa(); for( int i = 0 ;i M;i ++ ) { char s[200]; scanf(%s,s); cout SearchDfa(s) endl; } return 0; } 2010 福州赛区题目 Computer Virus on Planet Pandora 有n个各不相同的长度不超过1,000的模式串(0n=250),和一个长度不超过5,100,000的母串。如果母串包含某个模式串或其反转(“ABCD”的反转是“DCBA”),则称母串被模式串感染。问母串一共被多少个模式串感染。 2010 福州赛区题目 Computer Virus on Planet Pandora 1) 给模式串编上号,Trie图上每个终止节点记下它所对应的模式串的编号。为每个模式串设置一个是否已经被匹配的标记。走到某终止节点,就能知道哪个模式串被匹配,就设置其标记。 2)要注意的是,本题中,模式串里有可能一个串A是另一个模式串B的子串,在这种情况下,用母串在Trie图上跑一遍,就可能会发生走到B串的终止节点,即作出B被匹配的结论,但是却忽略了匹配B的过程中A其实也已经能够匹配这个情况。 2010 福州赛区题目 Computer Virus on Planet Pandora 2) 的解决办法: 对Trie图上的每个节点设置一个“是否计算过”的标记,初始值全部为假。假定在原Trie树上的节点x所对应的字符串为s,那么x节点“已计算过”,就意味着s的所有模式子串,都已经被标记为“已匹配”。在用母串在Trie图上跑的过程中,每到达一个“未计算过”的节点,就将该节点标记为“已计算过”,然后就要将该节点对应的s的所有后缀模式串(既是s的后缀,又是模式串的字符串)都标记为“已匹配”(s的非后缀模式子串在扫描到s之前就已经被标记为“已匹配”了。这个标记的过程,就是沿着节点的后缀指针一直走到根节点,将路径上(包括起点)的每个模式串的终止节点所对应的模式串,都标记为“已匹配”。显然,这条路上的每个节点在Trie树上对应的字符串,都是s的后缀,而且所有既是s的后缀,且在Trie树上有对应节点的字符串,其对应节点也一定会出现在这条路经上。 小结 KMP和DFA充分利用了当前已知的信息,构造出了NEXT数组和前缀指针,避免了比较过程中冗余,从而提高了算法的效率。 以上只是DFA很小的一个应用。 DFA不但可以高效的处理多串模式匹配问题,而且在字符串模式匹配问题上,提供了一个新的数据储存结构,从而可以达到一些意想不到的效果。在DFA上进行动归,是常见的做法。 我们接着看下一道题 POI #7 题:病毒 已知若干个01串,他们是病毒的特征代码。如果一段程序(由01组成)不含有任何病毒特征代码,则称它为安全程序。请判断是否存在无限长的安全程序。 “无限长”的安全母串,在Trie图上,从根节点出发,可以永远不停地走下去,即走无限步,都不会路过 “不安全节点”, 而Trie图节点是有限的……. 模式串对应的终止节点是“不安全”节点,如果有一个节点,它的前缀指针指向的节点是“不安全”节点,那么它也是“不安全节点”。 “无限长”的安全母串,在Trie图上,从根节点出发,可以永远不停地走下去,即走无限步,都不会路过 “不安全节点”, 而Trie图节点是有限的……. 只需判断,Trie图上,由安全节点构成的子图上,有没有环即可,有,就能无限走下去 Trie图上进行动归:POJ 3691 DNA repair 给定不超过50个由 ‘A’, ‘G’ , ‘C‘ ,’T’. 四个字母组成的模式串,每个模式串长度不超过20,再给一个不超

文档评论(0)

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

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

1亿VIP精品文档

相关文档