文章目录

  • 11.串
    • 11.a ADT
    • 11.b 串匹配
      • 11.b1 串匹配
      • 11.b2 蛮力匹配
    • 11.c KMP算法
      • 11.c1 KMP算法:从记忆力到预知力
      • 11.c2 KMP算法查表
      • 11.c3 KMP算法理解next表
      • 11.c4 KMP算法构造next表
      • 11.c5 KMP算法分摊分析
      • 11.c6 KMP算法再改进
    • 11.d BM_BC算法
      • 11.d1 BM_BC算法 以终为始
      • 11.d2 BM_BC算法 坏字符
      • 11.d3 BM_BC算法 构造BC表
      • 11.d3 BM_BC算法 算法性能分析
      • 11.e1 BM_GS算法 好后缀
      • 11.e2 BM_GS算法:构造GS表
      • 11.e3 BM_GS算法:综合性能
      • 11.f1 Karp-Rabin算法:串即是数(整数)
      • 11.f2 Karp-Rabin算法:散列

day65

11.串

11.a ADT

真子串,真前缀,真后缀

11.b 串匹配

11.b1 串匹配

因为如果采用随机算法,匹配成功的概率非常低,所以在测评算法复杂度时,将匹配失败和匹配成功分开考虑,分别计算算法复杂度。

11.b2 蛮力匹配

蛮力算法的效率之所以很低,是因为他不足以处理这种大量的局部匹配(前面都匹配成功,到最后匹配失败),字母表越小,最坏情况出现的概率越高,随着字母表的增大,最坏情况出现的概率降低(一般在匹配初期就会发现匹配失败),可以达到期望的的O(n)复杂度。

11.c KMP算法

11.c1 KMP算法:从记忆力到预知力

存在大量局部匹配的前缀
两个优点:①大幅度的向后滑动模式串,而不是每次只滑动一个字符②可以避免大量重复的比对
匹配失败后,要如何确定下一次匹配的起始位置?

11.c2 KMP算法查表

可以排除不必要的对其位置

11.c3 KMP算法理解next表

t的取值很多,选择最大的t,KMP算法舍弃的那些t,都是不值得对其的位置。
匹配失败的问题:在P串前面放置一个哨兵(通配符),通过设置哨兵可以:简化代码,统一理解。
虚拟实验:既是物理学的有效研究方法,也是计算机科学的重要技巧

11.c4 KMP算法构造next表

11.c5 KMP算法分摊分析

上面为KMP算法的复杂度,相应的next的构造算法与KMP算法别无二致,只不过是模式串与模式串本身之间的比较,所以其复杂度为O(m),m为模式串的额长度。

11.c6 KMP算法再改进

后续的三次比对都是多余的;目前的KMP算法只是吸取了经验,未接收教训
避免一错再错
除了在端点处之外,没有任何重合;复杂度为O(2n)
对于蛮力算法,在最好情况下,可能只需要经过一次比对,就可以排除掉一个对齐位置,此时他的复杂度为O(n),在实际生活中,随着字符集规模的增大,这种最好情况发生的概率会逐渐增大,KMP算法相比于蛮力算法的优势会越来越小。

11.d BM_BC算法

11.d1 BM_BC算法 以终为始

判断两个字符串是否相等与判断其是否不等,效率是不一样的。
如何高效排除无效的对齐位置?更多的关注靠后的教训(失败比对),价值更高,如下图,靠后的教训可以帮助排除更多的无效对齐位置。
图中红色字符意思:当字符集数目足够大,串匹配成功的概率远小于失败的概率
灰色为失败的比对,黑色为成功的比对

11.d2 BM_BC算法 坏字符

和KMP算法一样,因为与文本串无关,只与模式串有关,所以位移量可以预先计算出来,生成BC表
特殊情况要考虑:①模式串中有多个X,选择秩最大的②模式串中无X,在串开头增设通配符哨兵
③秩过大,超过了j,只需要将整个模式串右移一个位置

11.d3 BM_BC算法 构造BC表

11.d3 BM_BC算法 算法性能分析


上图为BM_BC算法在最坏情况下的复杂度O(n*m),最坏时退化为蛮力算法,究其原因还是目前BM_BC算法只是利用了教训(BC-坏字符策略),没能很好的利用经验(GS-好后缀)。

11.e1 BM_GS算法 好后缀

上述是BM_BC算法匹配的过程,由于只关注教训,没利用经验,导致前两次匹配,每次只能挪动一步。
如果模式串中有多个于V(k)匹配的,应当选最靠右且串的前置字符不为Y(X与Y已经不匹配了,至少不能在选一个Y),使得位移量尽可能地小。当然有可能不存在与V(k)匹配的子串,此时应当去模式串前缀与V(k)的后缀匹配最长者。下图为一个实例:

11.e2 BM_GS算法:构造GS表

怎么构造没看懂,查一下

11.e3 BM_GS算法:综合性能

综合复杂度分析如下图,其中|Σ|代表字母表的大小,字母表越大,单词匹配成功的概率(Pr)越低,蛮力算法效果越好。

11.f1 Karp-Rabin算法:串即是数(整数)

凡物皆数
自然数向量和自然数之间可以彼此转化

11.f2 Karp-Rabin算法:散列

问题:散列冲突;解决–哈希只用来筛选,还要进行进一步的精确匹配

邓俊辉数据结构与算法学习笔记-第十一章相关推荐

  1. 邓俊辉数据结构与算法学习笔记-第四章

    文章目录 栈和队列 a 栈的接口与实现 a1 栈 a2 实例 a3 实现 c c1-1 栈的典型应用 c1-2 进制转换算法 c1-3实现 c2-1括号匹配实例 c2-2 尝试 c2-3 构思 c2- ...

  2. 邓俊辉 数据结构与算法C++版 第十三章 串 ADT

    邓公数据结构与算法 第十三章 串 ADT 定义和特点 术语 ADT接口实现 模式匹配 问题与需求 算法测试方法 蛮力匹配 构思 蛮力匹配:版本1 蛮力匹配:版本2 蛮力匹配:性能分析 KMP算法 ne ...

  3. 清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示

    清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示 有关概念: 与图论略有不同,数据结构中的树:1.需要为每一颗树指定一个特殊的顶点,作为"根"(root),对应rooted ...

  4. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  5. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

  6. 数据结构与算法学习笔记——链栈

    数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...

  7. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

  8. 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配

    数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...

  9. 数据结构与算法 学习笔记(5):字符串

    数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...

最新文章

  1. 面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
  2. 中国肠道大会 | 日程及嘉宾(4月16日更新)
  3. 【错误记录】Android Studio 编译报错 ( A problem occurred starting process ‘command ‘ninja.exe‘ ‘ )
  4. 曼哈顿距离java实现_基于javascript实现获取最短路径算法代码实例
  5. java字符串操作_Java的字符串操作
  6. winform执行oracle语句,C#中的Winform应用程序连接远程Oracle数据库的配置文件及SQL语句的写法...
  7. Nginx学习总结(2)——Nginx手机版和PC电脑版网站配置
  8. abb机器人写字程序实例_abb机器人程序实例
  9. 《校园封神榜》个人工作总结——第十天
  10. 哈工大密码学实验(CA证书认证系统)
  11. python元类 orm_Python3 元类与ORM
  12. vue使用甘特图(实现树形结构/一条数据显示双时间轴)
  13. 【翻译】YOLOX: Exceeding YOLO Series in 2021
  14. 专业运动耳机哪个品牌好?运动蓝牙耳机推荐
  15. 寒假线上兼职:300-500元/小时,安利一个大学生也能月入8K的线上兼职!
  16. 《众妙之门——自由网站设计师成功之道》一1.1 迈向成功的几个必要习惯
  17. 团队开发工具之一——Wiki
  18. PHP判断用户是否已经登录,如果登录则显示首页,如果未登录则进入登录页面或注册页面
  19. 我在上海赶飞机 出租司机给我上了一堂MBA课
  20. 安超云荣获“国民云计算品牌”值得关注奖

热门文章

  1. 从简单的线性方程开始了解Paddle Fluid 的全连接层 FC
  2. liner、dense、mlp、fc区别
  3. python气象卫星云图解析_python下载卫星云图合成gif
  4. 关于项目需求进行分析的步骤
  5. 基于 OAI 部署私有的 4G EPS
  6. (线段判交的一些注意。。。)nyoj 1016-德莱联盟
  7. 浅谈SEO(搜索引擎优化)
  8. TypeScript简明教程
  9. BZOJ 1050 [HAOI2006]旅行comf(最小生成树)
  10. 基于非洲秃鹫优化算法的函数寻优算法