数据结构(十一)串

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

数位溢出

 

 

散列压缩

 

 散列冲突

 

 快速指纹计算

 

posted on 2019-09-25 14:39  AI数据  阅读(393)  评论(0编辑  收藏  举报

导航