KMP算法总结
来源:互联网 发布:写筒谱的软件 编辑:程序博客网 时间:2024/05/17 05:06
本文参考:字符串匹配的KMP算法
KMP算法是一个效率很高的字符串匹配算法,时间复杂度能做到O(n)级别。在这里整理记录该内容。
现在,为了理解这个算法,首先给出一个实例,来感受一下它的匹配过程。一个例子
举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?
1、首先,比较"BBC ABCDAB ABCDABCDABDE"和"ABCDABD"的首个字符,’B’和’A’不同,搜索词向后移动一位。
2、’B’和’A’不同,搜索词向后移动一位。就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。
3、接着比较搜索词与参考词的下一个字符。
4、这时,出现了最后一个字母不匹配的情况,如何移动字符串使其,能够快速并不重复比较已经比较过的部分能。KMP算法就是解决这一问题的。
5、KMP算法借助一张“部分匹配表”解决重复比较的问题。搜索词生成的“部分匹配表”如下:
这张表如何使用呢?首先,假设我们比较左侧’B’时,发现不相等,那么将参考字符串中的词跟搜索词0号位置的字符’A’比较;同理,比较搜索词末尾单词时,发现不等,那么就将参考字符串中的词跟搜索词2号位置的字符’C’比较;当搜索词的0号位置的‘A’跟参考字符串比较不相等时,就将‘A’与参考字符串的下一个位置的字符串进行比较。
6、有了部分参考表,继续步骤4的操作,得到如下,依然不相等,则让搜索词中2号位置的字符与空格比较。
7、同样不相等,则将参考词的0号位置的字符与参考串的空格字符的下一个字符比较。
8、到这一步依次比较每个字符,发现最后一个字符不等,则继续比较搜索词的2号位置的字符相等。
9、最后比较的到了,比较成功了,参考字符串中含有搜索词。
“部分匹配表”是什么原理
这里引入了“前缀”和“后缀”的概念。要求“前缀”的第一字符不在“后缀”中,同样“后缀”的最后一个字符不能在“前缀”中。举例说明,针对搜索词,“前缀”有:"A"、"AB"、"ABC"、"ABCD"、"ABCDA"、"ABCDAB";“后缀”有:"BCDABD"、"CDABD"、 "DABD"、"ABD"、" BD"、"D"。有了这两个概念后,下面继续……
“部分匹配表”表示不包括当前字符的情况下,前面字符组成的字符串的前缀和后缀共有的元素最长长度。
根据下表,针对每个元素,分析每个值的由来:
匹配表0位置:默认为-1
匹配表1位置:因为”A”前面没有“前缀”和“后缀”,所以为0
匹配表2位置:”AB” “前缀”为”A”,“后缀”为”B”。公共长度为0
匹配表3位置:”ABC” “前缀”和“后缀”无公共部分。公共长度为0
匹配表4位置:”ABCD” “前缀”和“后缀”无公共部分。公共长度为0
匹配表5位置:”ABCDA” “前缀”和“后缀”有公共部分”A”。公共长度为1
匹配表6位置:”ABCDAB” “前缀”和“后缀”有公共部分”AB”。公共长度为2
- KMP (KMP+拓展KMP)算法总结
- KMP算法总结
- kmp算法总结
- KMP算法总结
- KMP算法总结
- KMP算法学习总结
- KMP算法大总结
- kmp算法总结
- KMP算法总结
- KMP算法总结
- KMP算法总结
- KMP算法学习&总结
- KMP算法学习&总结
- KMP算法总结
- kmp算法总结
- 拓展kmp算法总结
- KMP算法总结
- kmp 算法总结
- Eclipse NDK安装流程详解
- GCD与NSOperation
- 在Windows下使用Gpg4win对文件进行完整性校验(PGP校验)
- arduino 大小端数据问题
- Linux内核IP Queue机制的分析(一)——用户态接收数据包
- KMP算法总结
- canvas基础学习(二)-线条的属性与星空和图形变换
- Intent 实现Activity跳转
- 发表测试
- 面向对象之三大特点
- 米老师讲课:到底怎么学习
- scrapy爬取动态分页内容
- JAVA面向对象基础 对象 类 方法学习笔记
- C++ 智能指针(shared_ptr/weak_ptr)源码分析