博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
算法——字符串匹配算法自己有限的驾驶机器
阅读量:5897 次
发布时间:2019-06-19

本文共 2445 字,大约阅读时间需要 8 分钟。

前言

    上篇文章介绍《》。这里介绍有限自己主动机(Finite Automata)字符串匹配算法,有限自己主动机(Finite Automata)字符串匹配算法最基本的是计算出转移函数。

即给定一个当前状态k和一个字符x。计算下一个状态;计算方法为:找出模式pat的最长前缀prefix。同一时候也是pat[0...k-1]x(注意:字符串下标是从0開始)的后缀,则prefix的长度即为下一个状态。匹配的过程是比較输入文本子串和模式串的状态值,若相等则存在。若不想等则不存在。

有关理论知识參考《算法导论》,这里不正确理论知识进行解说。

有限自己主动机字符串匹配算法

    若模式串pat的长度为m。则状态值为0-m,即有m+1个状态,初始状态为0当中numbers=NO_OF_CHARS为输入字符表的个数,从下面的源代码能够知道,计算转移函数(即预处理)的时间复杂度为,匹配时间复杂度为

该算法能够依据后面介绍的KMP算法进行改进,对求解转移函数的过程进行改进能够得到比較好的时间复杂度

    下面是模式串为P=abababaca的自己主动机运行过程

源代码实现

#include
#include
using namespace std;const int NO_OF_CHARS = 256;//the numbers of input alphabetint getNextState(const string &pat, int M, int state, int x){ // If the character c is same as next character in pattern, // then simply increment state if (state < M && x == pat[state]) return state+1; int ns, i; // ns stores the result which is next state // ns finally contains the longest prefix which is also suffix // in "pat[0..state-1]c" // Start from the largest possible value and stop when you find // a prefix which is also suffix for (ns = state; ns > 0; ns--) { if(pat[ns-1] == x) { for(i = 0; i < ns-1; i++) { if (pat[i] != pat[state-ns+1+i]) break; } if (i == ns-1) return ns; } } return 0;} /* This function builds the TF table which represents Finite Automata for a given pattern */void compute_Transition_Function(const string &pat, int M, int TF[][NO_OF_CHARS]){ int state, x; for (state = 0; state <= M; ++state) for (x = 0; x < NO_OF_CHARS; ++x)//for each charater c in the inout alphabet table TF[state][x] = getNextState(pat, M, state, x);} /* Prints all occurrences of pat in txt */void Finite_Automata_search(const string &pat, const string &txt){ int M = pat.length(); int N = txt.length(); int TF_len = M+1; //this is supported by C++11 int TF[TF_len][NO_OF_CHARS];//the state of transform table, stores the states. compute_Transition_Function(pat, M, TF);//compute the state of Transition Function // Process txt over FA. int state=0;//inite the state for (int i = 0; i < N; i++) { state = TF[state][txt[i]]; if (state == M) cout<<"patterb found at index is:"<
<

參考资料:

《算法导论》

本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4914074.html,如需转载请自行联系原作者

你可能感兴趣的文章
Eclipse中修改代码格式
查看>>
关于 error: LINK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案...
查看>>
Linux 进程中 Stop, Park, Freeze【转】
查看>>
PHP盛宴——经常使用函数集锦
查看>>
安装gulp及相关插件
查看>>
如何在Linux用chmod来修改所有子目录中的文件属性?
查看>>
Hyper-V 2016 系列教程30 机房温度远程监控方案
查看>>
笔记:认识.NET平台
查看>>
cocos2d中CCAnimation的使用(cocos2d 1.0以上版本)
查看>>
gitlab 完整部署实例
查看>>
SCCM 2016 配置管理系列(Part8)
查看>>
struts中的xwork源码下载地址
查看>>
我的友情链接
查看>>
PHP 程序员的技术成长规划
查看>>
python基础教程_学习笔记19:标准库:一些最爱——集合、堆和双端队列
查看>>
js replace,正则截取字符串内容
查看>>
javascript继承方式详解
查看>>
lnmp环境搭建
查看>>
自定义session扫描器精确控制session销毁时间--学习笔记
查看>>
仿射变换
查看>>