当前课程知识点:数据结构(下) > 第十一章 串(上) > (c3)KMP算法:理解next[]表 > 11c3-1: 快速移动
在接下来的这节
就让我们从严格的意义上来理解
next表的具体含义及其原理
我们已经切实地看到
KMP算法的优化效果
首先体现在它可以使模式串得以快速地后移
而不是如蛮力算法那样只能亦步亦趋
反过来我们也可以认为
KMP可以聪明地排除掉很多不必要的对齐位置
而这些位置之所以被排除掉
是因为KMP发现它们不具备某种必要条件
正如我们马上就要看到的
这种必要条件就具体体现为模式串自身的某种匹配性
依然回到这样一个串匹配的典型场景
我们在T[i]与P[j]之间 发现了一次失配
接下来 KMP会去查询next表
取出对应的表项t
并用P[t]来取代此前的P[j]
使之继续与此前的T[i]相对齐
并从这个位置出发
继续后续的比对
我们的问题是
KMP在这种场合 为何会选定这样一个特定的t呢
或者说 这样的t又具备哪些必要条件呢
答案就藏在这幅图中
我们来考察t所对应的这个前缀
在KMP算法中
这个前缀将不再会重复地接受比对
我们已经看到
之所以能够这样
是因为KMP已经预先判定
这个前缀必然会与主串中对应的这个子串完全匹配
在这里 我们需要回过头来考察此前P[j]所对应的这个前缀
同样地
这个前缀在当年 也应该和这个子串是完全匹配的
因此 相对于它
文本串中这个长度为t的子串
就是一个后缀
另一方面
既然这个新的前缀
是由此前的前缀 经过右移之后而得到的
所以 同样相对于此前的这个前缀
它依然是一个长度为t的前缀
由此 我们也就得出了关于t的一个 至关重要的必要条件
也就是说 在此前的这个前缀中
必须有一个长度为t的前缀与长度为t的后缀彼此相等
也就是说
在相对于p[j]而言的这个前缀中
其首部和尾部 必须具有一定的相似性
这个必要条件 可以形式化地表示为这样一个等式
其左侧是一个真前缀
而右侧则是一个真后缀
就任何一个特定的模式串P而言
对于区间内的任何一个整数j
如果将满足上述条件的t筛选出来 就可以得到这样一个候选集合
根据刚才的分析
既然这些t都满足上述必要条件
那么一旦在T[i]和P[j]处发生一次失配
只有来自于这个集合中的t 才有资格作为下一轮的对齐位置
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试