邓俊辉数据结构与算法学习笔记-第十一章
文章目录
- 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算法:散列
问题:散列冲突;解决–哈希只用来筛选,还要进行进一步的精确匹配
邓俊辉数据结构与算法学习笔记-第十一章相关推荐
- 邓俊辉数据结构与算法学习笔记-第四章
文章目录 栈和队列 a 栈的接口与实现 a1 栈 a2 实例 a3 实现 c c1-1 栈的典型应用 c1-2 进制转换算法 c1-3实现 c2-1括号匹配实例 c2-2 尝试 c2-3 构思 c2- ...
- 邓俊辉 数据结构与算法C++版 第十三章 串 ADT
邓公数据结构与算法 第十三章 串 ADT 定义和特点 术语 ADT接口实现 模式匹配 问题与需求 算法测试方法 蛮力匹配 构思 蛮力匹配:版本1 蛮力匹配:版本2 蛮力匹配:性能分析 KMP算法 ne ...
- 清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示
清华大学邓俊辉-数据结构MOOC笔记-树的概念及逻辑表示 有关概念: 与图论略有不同,数据结构中的树:1.需要为每一颗树指定一个特殊的顶点,作为"根"(root),对应rooted ...
- 数据结构与算法学习笔记之 从0编号的数组
数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...
- 数据结构与算法学习笔记之 提高读取性能的链表(上)
数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...
- 数据结构与算法学习笔记——链栈
数据结构与算法学习笔记(C语言) 链栈 在开始链栈的学习之前,我们先实现一下上一篇文章中提到的检查括号匹配的小程序,鉴于水平有限,本人就随便写一下代码好了,目标仅限于对功能的实现. /*用顺序栈这种数 ...
- 数据结构与算法学习笔记4:递归+分治法
数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...
- 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配
数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...
- 数据结构与算法 学习笔记(5):字符串
数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...
最新文章
- 面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?
- 中国肠道大会 | 日程及嘉宾(4月16日更新)
- 【错误记录】Android Studio 编译报错 ( A problem occurred starting process ‘command ‘ninja.exe‘ ‘ )
- 曼哈顿距离java实现_基于javascript实现获取最短路径算法代码实例
- java字符串操作_Java的字符串操作
- winform执行oracle语句,C#中的Winform应用程序连接远程Oracle数据库的配置文件及SQL语句的写法...
- Nginx学习总结(2)——Nginx手机版和PC电脑版网站配置
- abb机器人写字程序实例_abb机器人程序实例
- 《校园封神榜》个人工作总结——第十天
- 哈工大密码学实验(CA证书认证系统)
- python元类 orm_Python3 元类与ORM
- vue使用甘特图(实现树形结构/一条数据显示双时间轴)
- 【翻译】YOLOX: Exceeding YOLO Series in 2021
- 专业运动耳机哪个品牌好?运动蓝牙耳机推荐
- 寒假线上兼职:300-500元/小时,安利一个大学生也能月入8K的线上兼职!
- 《众妙之门——自由网站设计师成功之道》一1.1 迈向成功的几个必要习惯
- 团队开发工具之一——Wiki
- PHP判断用户是否已经登录,如果登录则显示首页,如果未登录则进入登录页面或注册页面
- 我在上海赶飞机 出租司机给我上了一堂MBA课
- 安超云荣获“国民云计算品牌”值得关注奖