在这里我所要想说的比KMP算法高效的算法是Boyer-Moore算法。
在讲解Boyer-moore算法之前,在这里先回顾一下KMP算法。
比如说有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"。大部分情况下我们会使用KMP算法去解:
首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较。因为B与A不匹配,所以搜索词后移一位。
2.
B与A不匹配,搜索词向后移一位。直到有一位搜索词相同。
3.
可以看到前6个数都是相同的,但是最后一个数D与空格不相同。根据KMP算法,搜索词向后移动一位。但是这就是KMP算法效率低的地方,之前的6个数我们已经比较过了,已经不可能匹配了,但是KMP算法还是重复的匹配。在后面讲的Boyer-Moore算法会有优化。
4.
其实KMP在这里是有优化的,KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率。
利用《部分匹配表》(Partial Match Table)可以根据公式:
移动位数 = 已匹配的字符数 - 对应的部分匹配值;
算出向后移动的位数。
5. 部分匹配表实例: