算法-字符串匹配(三)
概述
Sunday 算法是一种经典地字符串匹配算法。它通过简化 BM 算法操作而成,并且实践证明:Sunday 算法查询性能好于 BM 算法,故而该种算法在字符串匹配问题上应用最为广泛。
我们首先简单回顾一下 BM 算法:它采用从后往前方式比较字符,使用坏字符规则和好后缀规则实现跳跃无效匹配。值得注意的是:BM 算法实践之中,有人统计发现:绝大多数地跳跃操作均来自于坏字符规则。另外,由于好后缀表构造比较麻烦而坏字符表构造简单,所以就提出了一种 BM 算法阉割版——仅使用坏字符规则实现跳跃。
Sunday 算法就属于 BM算法阉割版地一种,但是它对坏字符规则进行了修改:在 BM 算法中,匹配失败的字符称为坏字符;而在 Sunday 算法中,匹配失败时参与匹配的最末位字符的下一位字符称为坏字符。举例而言:对于 BM 算法而言,图中 text[1] = 'u'
属于坏字符;对于 Sunday 算法而言,图中 text[6] = 'i'
属于坏字符。
正是由于这样地修改,使得 Sunday 算法并不局限于从后往前比较字符,它同样可以采用从前往后比较字符。
实现
BM 已然实现,这种实现就比较简单。其实现代码如下:
1 | private int[] genBc(String pattern) { |
时空复杂度
理论证明:最坏时间复杂度为 $O(text.length * pattern.length)$,平均时间复杂度为 $O(text.length)$,空间复杂度为 $O(pattern.length)$。