数据结构(十一)串

一、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算法:散列

数位溢出

散列压缩

 散列冲突

 快速指纹计算

原文地址:https://www.cnblogs.com/aidata/p/11584445.html