算法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
- 转换成三叉树