标签:技术 记录 演示 算法 code 算法思想 mamicode 信息 前缀和
字符串匹配简单方式是第一个字母跟对比字符串的第一个字母对比,
相同就对比第二个字符串,
不相同就整体往后移,以此类推.
这样的查找方式是无效率的.
一个基本事实是,当空格与D不匹配时,你其实知道前面六个字符是"ABCDAB"。
KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,
继续把它向后移,这样就提高了效率。
前缀就是除了最后一个元素,其余都是前缀
后缀就是除了第一个元素, 其余都是后缀
比如拿这个字符串来说 "ABCDABD"
①元素A的前缀和后缀都是空,共有元素长度 = 0
②元素AB的前缀是A,后缀是B, 共有长度 = 0
.
.
⑤元素ABCDA的前缀是A、AB、ABC、ABCD,后缀是BCDA、CDA、DA、A,供同元素长度 = 1(前缀有一个A, 后缀也有个A)
⑥元素ABCDAB的前缀是A、AB、ABC、ABCD、ABCDA, 后缀是BCDAB、CDAB、DAB、AB、B,共同元素长度 = 2 (前缀有一个AB, 后缀也有个AB)
.
以上记录转为图片,图片里的‘部分匹配值=前缀和后缀的共同元素’
通过这个图片的部分匹配值以及通过这个公式(移动位数=已匹配的字符数-对应的部分匹配值)
达到字符串匹配的效率。
演示:
指针目前在D的位置,匹配到空格,前面ADCDAB已经匹配,数量为6, ABCDAB的共同元素为2,所以6-2 = 移动步长。
.
.
.
最后匹配为止。
参考:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html
标签:技术 记录 演示 算法 code 算法思想 mamicode 信息 前缀和
原文地址:https://www.cnblogs.com/hornets/p/12455827.html