字符串匹配——KMP
来源:互联网 发布:jumpsoles 淘宝 编辑:程序博客网 时间:2024/06/06 03:16
参考文献:算法导论
实际匹配过程引用自:http://ds.fzu.edu.cn/fine/resources/FlashContent.asp?id=40
一般能想到
一个字符串比配问题,我们可能最长能想到的就是回溯的比较两个串,例如
abcacabababcb和ababc两个串进行比较
通常的做法是:
- 从第一个字符开始比较,abcacabababcb 和 ababc比较,发现相同
- abcacabababcb 和 ababc比较,发现相同
- abcacabababcb 和 ababc比较,发现不同
- 从第二个字符开始比较,abcacabababcb 和 ababc比较,发现不同
- 从第三个字符开始i比较
- ...
KMP算法
KMP和有限自动机一样,需要对模式串有预处理,但是KMP对模式串的预处理时间复杂度为O(m),而有限自动机的时间复杂度为O(m|∑|),显然KMP是一种更为高效的算法
和有限自动机一样,KMP也需要预先处理一个函数π,该函数的处理思想为设置一个变量来保存上一次匹配的最长前缀k,即表示到上一次字符串处理结束为止,模式串长度为k的前缀和其长度为k的后缀相同,也就是说这一次我们只要比较第k+1个字符和当前遍历到的字符如果相同,则说明有长度为k+1的前缀和长度为k+1的后缀相同
例如:ababa
如果上一次遍历到第3个字符和第1个字符相同,则这一次只要比较第4个字符和第2个字符相同则说明——第1,2个字符和第3,4个字符相同
---------------------------------------------------------------乱入的文字结束-------------------------------------------------------------------------------
模式串预处理过程
abababac
(从第二个字符开始匹配,红色表示前缀,绿色表示后缀,黄色表示相交的部分,蓝色表示两个字母比较)
第1次:a != b , k = 0 , (串:ab , k=0则下次还从第一个字符开始匹配)
第2次:a = a , k = 1 , (串:aba , k=1则下次从第二个字符开始匹配)
第3次:b = b , k = 2 , (串:abab , k=2则下次从第三个字符开始匹配)
第3次:a = a , k = 3 , (串:ababa , k=3则下次从第四个字符开始匹配)
第4次:b = b , k = 4 , (串:ababab, k=4则下次动第五个字符开始匹配)
...
由此可见,其整理过程只遍历了一次模式串
实际匹配过程
大家可以参考这个:http://ds.fzu.edu.cn/fine/resources/FlashContent.asp?id=40
其中偏移距离计算公式为:s = i - π[i-1](i为第一次不同的位置,则i-1为最后一次相同的位置)
- 字符串匹配——KMP
- 字符串匹配——KMP
- 字符串匹配—KMP算法
- 字符串模式匹配——KMP算法
- 字符串模式匹配——KMP算法
- KMP算法——字符串匹配问题
- 字符串匹配算法——KMP && BF
- 字符串匹配算法——KMP算法
- KMP学习——字符串的匹配
- 字符串匹配——KMP算法
- 字符串匹配——KMP算法
- 字符串匹配——KMP算法
- 字符串匹配——KMP算法
- KMP算法——字符串匹配
- [LeetCode]KMP——字符串匹配
- 字符串匹配——KMP算法
- 字符串匹配——KMP算法
- 字符串匹配 —— KMP 算法
- HDU 2546 饭卡(01背包)
- Android游戏——学习小结(一个简单的设计小游戏)动画射击
- 【Android开机启动Activity或者Service方法】
- C++字符串作函数参数/函数返回值
- 监听文件变化,并且在主线程呈现结果
- 字符串匹配——KMP
- 【深入理解计算机系统】_2_计算机系统中的信息表示
- Android实现带Tab页引导的ViewPager
- Linux 设备驱动篇之I2c设备驱动
- 安卓学习总结资料
- 逆向一个三层循环的算法
- 搭建可复用的游戏服务器框架的思路
- 获取手机中安装的所有应用程序
- Android_AsyncTask详解及其应用(三)_图片错位以及AsyncTask重复创建的问题