一、ADT
定义

术语

ADT

b1串匹配


算法评测

b2 蛮力匹配

版本一

版本2

复杂度



c1KMP算法:从记忆力到预知力
蛮力,为何低效

很多比对不必进行
不变性

只要记忆力足够强

记忆力转为预知力
c2KMP算法:查询表
事先确定t

算法

实例
模式串,下面是对应的查询表,倒数第三个字符秩为j=7,查询表中next值为3

主串,如果轮到这个表项发挥作用,说明当前这轮比对中,此前七个字符都是成功的

即此时的场景是如下,即模式串中的字符l,与文本串中某个不是l的字符比对失败

比对之前为模式串拍一个快照

手动执行KMP算法,当前j=7,指向模式串中的字符l,接下来,KMP将在查询表中取出对应的那一项next[7},并用它来更新j,这个表项是3
,接下来会用秩为3的字符,也就是n取代l,并继续与文本串中此前失配的字符对齐,就像这样:

为模式串再拍一张快照:

前后两张快照,模式串向右移动了4个字符,KMP排除了三个对齐位置
c3 KMP算法:理解next[]表
自匹配=快速右移
借助必要条件,排除对齐位置

最长自匹配=快速右移+避免回退
Next[0]==1

巧妙地使用哨兵,可以简化代码,统一理解
c4 KMP算法:构造next[]表
递推


实现

c5 KMP算法:分摊分析

c6 KMP算法:再改进
反例

改进

失败情况:Brute-force
失败情况:KMP
多个字符对多个字符
d1 BM算法:坏字符
善待教训
更多地关注教训,使之更早地出现,更大者更早出现
前轻后重
以终为始

Bad-Character

构造bc[]表

最好情况

最差情况
利用好了教训,没有很好的利用经验

e1 BM_GS算法:好后缀
经验=匹配的后缀
good suffix shift

实例

e2 BM_GS算法:构造gs表
MS[]->ss[]


ss[]->gs[]

构造ss[]

e3 BM_GS算法:综合性能
性能


纵览

f1 Karp-Rabin算法:串即是数

凡物皆数


串亦为数

f2 Karp-Rabin算法:散列
数位溢出

散列压缩

散列冲突

快速指纹计算
