horspool算法和Sunday算法都是BM算法的改进,我刚开始的时候还搞混了,所以这里总结一下喵(超简洁喵~)
BM算法
子串中:从右往左匹配
坏字符:主串中与模式串不匹配的第一个字符
好后缀:主串中与模式串后缀匹配的子串
坏字符规则:
好后缀规则:
在只有坏字符规则下可能出现左移的情况:
所以要将坏字符和好后缀规则结合起来,我们可以分别计算两个规则向右滑动的位数,然后取两个数中最大的,作为模式串往后滑动的位数。
horspool算法
匹配窗口:主串中与模式串正在配对比较的部分
主要思想:模式串中从右往左与匹配,若相等,则继续比较,直到完全相等或者出现第一个坏字符;
如果不匹配,则判断主串匹配窗口中的最后一个字符是否在模式串中。如果不在,模式串直接整体跳过当前匹配窗口,即右移的长度为模式串的长度;如果在,则移动长度为模式串中该字符(除了模式串中最后一位外)距离模式串右端的最近距离。
例如:
如果是BM算法,这里就会看坏字符b在bcc中出现的位置以及好后缀c在bcc中出现的位置并进行比较,选出移动最大的,进行计算。
Sunday算法
主要思想:在子串中从左向右与模式串比较,匹配失败时关注的是主串中参加匹配的最后一个字符的下一个字符根据该字符是否存在于子串来决定向右移动几位。
欢迎讨论喵~今天用手机打的字,没有表情包