Sunday算法是一种比BM算法搜索速度更快的算法。
其核心思想是:在匹配过程中,当发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高匹配速度。
当匹配失败时关注的是文本串中参加匹配的最末位字符的下一位字符。如果该字符没有在模式串中出现则直接跳过,
移动步长=模式串的长度+1;否则移动步长=模式串中最右端的字符到末尾的距离+1.
Sunday算法的复杂度为O(n/m),最差复杂度为O(n*m)
这里文本串S=GCGCBGAGTAACAGAG ,模式串P=CAGAG
说明Sunday算法的运行过程,进行了12次匹配
Sunday 算法的匹配策略是:先匹配,发生失配时再转移
而匹配次数越多则执行效率越低,那能不能先转移后匹配呢?答案是肯定的。
这就是Sunday算法的优化。算法在匹配前先检验模式串的最后一个字符位置在文本串中对应的位置的字符是否在模式串中出现,如果没有则从该字符的下一位进行下一轮循环,移动步长=模式串长度,这样避免了匹配,提高了执行速度。
这里用Sunday算法的优化运行上面的例子,只匹配了6次