一、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算法:散列
数位溢出
散列压缩
散列冲突
快速指纹计算