算法4A----字符串

算法4A----字符串

preliminaries

  • 一系列的字符连起来
  • 一种退化的线性结构,只能存储字符的向量 ascii/unicode
  • 一般很长
  • 局部整体性,单独拿出一部分,call-by-pattern
  • 子串substr,也叫做切片
  • 前缀prefix,也可以写成子串形式
  • 后缀suffix,也可以写成子串形式

pattern matching

  • 在test中找打潜在的pattern
  • test很大,pattern比test小2到3个数量级
  • 随机的生成test和pattern,去测试算法性能的方法是不行的,因为成功的概率太低,如果是英文pattern有26的m次方中可能,test的排列组合是26^n种可能,
  • 正确的使用test的子串,去匹配

匹配/命中

蛮力算法

  • 从第一位开始比较,相等就向后移位,不相等就停止,从第二位开始匹配,逐位比较,这么循环下去

  • 如果有匹配的子串就会找到

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-crhte0RC-1602721984287)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015070622203.png)]

  • 灰色格子是剩下来的时间

  • Best O(n) worst O(n*m) m是patter长度 n是test长度

版本1(while版本)
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hFOYCvt-1602721984288)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015071126746.png)]
版本2(for版本)
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-erELf7Cr-1602721984289)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015071626630.png)]
a global view
  • 实际上是每步减一的速度前进

good prefix + look-up table

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PUpnBSme-1602721984291)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015072205772.png)]

  • 右下角的图不是移动一步,而是移动三步

example
  • 一个记录表

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5AopmWKx-1602721984292)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015072440251.png)]

  • 前进了4步,重新开始匹配也不是从m的第0位开始

KMP:algorithm

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wzHApb4A-1602721984293)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015072718656.png)]

  • O(n)

understanding next[]
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oQcVv0gv-1602721984294)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015073311794.png)]

  • 滑动窗口的残余长度,和已经比较过的test串的后缀相等部分

constructing next[]
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UnOG8fb1-1602721984295)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015073827204.png)]

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWneDrdb-1602721984295)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015074026271.png)]

kmp amortization
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SD6R6Qbu-1602721984296)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015074935593.png)]

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZeZnQEWm-1602721984296)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015075203764.png)]

改进
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rymYkrdy-1602721984297)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015075622832.png)]

  • 红色部分的教训要吸收

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-trkHqOBr-1602721984298)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015075916984.png)]

bc:begin with the end

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8QfQ6vKL-1602721984298)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015080627284.png)]

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4e5XPNe-1602721984299)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015081134446.png)]

构建bc表
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gT14GSZn-1602721984299)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015081305437.png)]
  • 画家算法,最后一笔,覆盖在之前的结果上
best/worst
  • best O(n/m)
  • worst O(n*m)
good suffix shift
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhV3xnYT-1602721984300)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015081756171.png)]
  • ¥ not y的过程

trie

  • 搜索过程中提供候选
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J4fMalJH-1602721984300)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201015082917806.png)]

trie – retrieval

  • 怎么省下空间
  • 只存有字符的位置
  • 有的有1个分支,有的有两个分支
  • 多叉树不简明,不紧凑,都可以转换成二叉树

ternary tree

  • 转换成三叉树
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值