前言
最近接触了很多字符串匹配算法。包括暴力的Naive算法,通过增加移动步长来减少移动次数的BM算法、KMP算法,sundy算法,以及多模式串匹配的AC自动机。今天总结一下各类算法的实现原理以及时间复杂度。
首先,各类子字符串匹配算法从图形的角度理解都是滑动的过程,首先将母串的头部和模式串的头部对齐,然后逐一比较每个元素,如果相同则比较成功。否则将模式串向后滑动一步,重新按位比较。而不同串行算法优化的关注点都是调整移动的步长,通过增加步幅来减少比较的次数。
一、Naive算法
Naive算法是最基本的双重循环,每次比较失败移动的步长都是1,时间复杂度是O(n*m)。
适用于数据量不大的场景中不需要做预处理
二、BM算法
BM算法是自字符串匹配诸多算法中平均运行效率BM算法最高的一个,但是需要较多的空间进行预处理。BM算法特点是后向比较,通过两种策略来优化移动的步长,坏字符策略 & 好后缀策略。提前对模式串进行预处理得到好后缀表和坏字符表
1、对于坏字符策略来讲:根据坏字符在模式串中最右的位置 决定移动的步长.
公式为 step = 坏字符在模式串中的位置-坏字符在模式串中最右的位置 。
2、对于好后缀策略来讲:根据最长好后缀在模式串中最右出现的位置决定移动的步长。
公式为 step = 好后缀在模式串中的位置 - 好后缀在模式串中最右的位置 。
最后选取两种策略中最优策略作为移动步长。
三、KMP算法
KMP算法是最经典惊且使用广泛的算法,时间复杂度为