王道408数据结构——第四章 串(KMP算法)
一、串的定义和实现
字符串简称串,是由零个或多个字符组成的有限序列,一般记为S=′a1a2⋅⋅⋅an′S='a_1a_2···a_n'S=′a1a2⋅⋅⋅an′,n称为串的长度。
串中任意多个连续字符组成的子序列称为该串的子串,相应的该串称为主串。某个字符在串中的序号称为字符在串中的位置,子串在串中的位置已子串的第一个字符的位置表示。
两个串相等的充分必要条件是:两个串长度相等,且各个位置对应字符相等
在王道教材中,串的下标从1开始
串的储存表示
1. 定长顺序储存表示
类似于线性表的顺序存储结构,用一组地址连续的存储单元储存串值的字符序列。为每个串,变量分配一个固定长度的储存区,即定长数组。
串的实际长度不能超过MAXSIZE,超过定长的串值会被舍去,称为截断(要客服这种弊端,只能采用动态分配的方法,不限定最大长度)。串的实际长度有两种表达方式:一种是用一个额外的变量存放串的长度;二是在串值后加一个不计入串长的结束标记符号“\0”,此时串长为隐含值。
2. 堆分配储存表示
堆分配储存表示仍然以一组地址连续的存储单元存放串值的字符序列,但他们的存储空间实在程序执行时动态分配的(从一个称为“堆”的自由储存区获取)。
二、模式匹配
求子串(模式串)在主串中的位置。
简单模式匹配算法最坏时间复杂度为O(mn),m和n非别为模式串和主串的长度。
简单模式匹配算法可以改进为KMP算法。
next数组
next[j]的取值为该字符前一个元素的部分匹配值+1,即最长相同前后缀长度+1,同时规定next[1]=0。
例如对于以下模式串,有next数组:
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
模式 | a | b | a | a | b | c | a | b | a |
next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 | 3 |
KMP算法执行
整体上与简单匹配算法类似
当匹配过程产生失配时,指向主串的指针i不变,指向模式串的指针j退回到next[j]的位置并重新进行比较;
当j为0时,i与j同时加1;
若主串的第i个位置和模式串的第一个字符不等,从主串的第i+1个位置开始匹配。
代码如下
int indexKMP(String S, String T, int next[]){ // 主串,模式串,next数组int i = 1, j = 1;while(i <= S.length && j <= T.length){if(j==0 || S.ch[i] == T.ch[j]){ // j等于0或未适配,两指针均向后移动i++;j++;}else{ // 指针失配且j不等于0,i不移动,j移动到next[j]处j = next[j];}if(j > T.length)return i - T.length; // 匹配成功else return 0;
}
KMP算法的时间复杂度为O(m+n)O(m+n)O(m+n),而一般情形下普通模式匹配算法实际执行时间近似也为O(m+n)O(m+n)O(m+n),因此至今仍被采用。KMP仅在主串与模式串有很多部分匹配时才显得比普通算法快得多,其主要优点是主串不回溯。
KMP算法优化
王道408数据结构——第四章 串(KMP算法)相关推荐
- 王道数据结构课代表 - 考研数据结构 第四章 串-KMP(看毛片算法) 究极精华总结笔记(C版本)
本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对数据结构知识点的理解的总结.希望对新一届的计算机考研人提供帮助!!! 关于对 串 章节知识点总结的十分全面,涵括了<王道数据结构 ...
- C语言数据结构-第四章 串-电大同步进度
第四章 串 字符串是计算机处理的最基本的非数值数据.字符串是一种特定的线性表,其特殊性就在于组成线性表的每个元素就是一个单字符. 本章给出: l 串的基本概念 l 串的 ...
- (王道408考研数据结构)第四章串-第二节:串的模式匹配算法(朴素和KMP)
串的匹配是一个非常重要的话题,我们在Word中经常使用的搜索功能所反映的就是串的匹配问题,相应的算法也是层出不穷,各有优缺点,本节主要涉及两种算法:朴素算法和KMP算法 在讲解之前,有几个术语需要掌握 ...
- (王道408考研数据结构)第四章串-第一节:串的定义和基本操作及存储结构
文章目录 一:串基本概念 (1)串的定义 (2)相关术语 (3)串的基本操作 二:串的比较 三:字符集编码 四:串的存储结构 (1)串的顺序存储 (2)串的链式存储 一:串基本概念 (1)串的定义 串 ...
- 王道408数据结构——第七章 查找
文章目录 一.基本概念 二.顺序查找(线性查找) 一般线性表的顺序查找 有序表的顺序查找 二.折半查找(二分查找) 三.分块查找(索引顺序查找) 四.B树 五.B+树 六.散列表 构造散列函数 1. ...
- 王道408数据结构——第六章 图
文章目录 一.图的基本概念 二.图的储存 邻接矩阵 邻接表 十字链表 邻接多重表 三.图的基本操作 四.图的遍历 广度优先搜索(BFS) 深度优先搜索(DFS) 图的遍历和图的连通性 五.最小生成树 ...
- 王道408数据结构——第五章 树与二叉树
文章目录 一.树的基本概念 树的性质 二.二叉树 满二叉树 完全二叉树 二叉排序树 平衡二叉树 二叉树的性质 完全二叉树的性质 三.二叉树的储存结构 顺序储存 链式存储 四.树的储存方式 双亲表示法 ...
- 王道408数据结构——第三章 栈和队列
一.栈 栈(Stack)是只允许在一端进行插入或删除操作的线性表. 栈顶:线性表允许插入删除的那一端 栈底:固定的.不允许进行插入删除的另一端 栈的操作特性可以概括为后进先出(LIFO) n个不同的元 ...
- 《数据结构》天勤和王道 第四章 串
<数据结构>天勤和王道 第四章 串 天勤部分 1. 串的基础 1.1 逻辑结构 1.2 存储结构 1.3 赋值操作 1.4 串比较 1.5 串连接 1.6 求子串 1.7 清空串 2. K ...
最新文章
- 如何使用 Mmcv.exe 工具来管理群集消息队列资源[转]
- 计算机网络(九)-物理层(补充)-傅里叶变换-信道复用
- 英语笔记:词组句子:0806
- Java:注解和反射
- php 数组作用域,如何在php中访问私有作用域命名空间数组数据?
- 揭开PC-Lint9的神秘面纱
- 递归创建多级文件目录(PHP)
- 修改 (WSL)Windows Subsystem for Linux默认为root登录
- 数学建模常用算法汇总及python,MATLAB实现(七) —— sklearn和SPSS实现主成分分析
- 优酷的kux格式怎么转换成mp4?教你快速转换的方法
- idea的HttpClient工具,发送post/get请求,可以发送json
- MongoDB 清理数据
- 怎么用图片编辑器给证件照换底色
- GDELT数据库入门与了解(码字中...)
- 弗雷歇距离 matlab,离散Fréchet(弗雷歇) 距离评价曲线相似度
- python123新版个人所得税计算_Python 小案例 计算个人所得税
- 计算机自杀式软件--USBKill
- java 滑杆和进度条_进度条 和 滑条
- ASP.Net: EshineASPNet教程-支付机构支付模块
- 解决Retrying connect to server
热门文章
- Dotnet Core下的Channel, 你用了吗?
- 微软开源基于 Envoy 的服务网格 Open Service Mesh
- Istio 中的授权策略详解
- 在 WSL2.0 的 Ubuntu 18 里使用 Docker
- 《ASP.NET Core 微服务实战》-- 读书笔记(第10章)
- 微软如何利用机器学习改进Win 10更新体验
- 利用Helm简化Kubernetes应用部署(1)
- .NET Core 使用 K8S ConfigMap的正确姿势
- Hyper-V + CentOS7 安装视频教程
- 一个实时收集MySql变更记录的组件CanalSharp.AspNetCore