当前课程知识点:数据结构(下) > 第十一章 串(上) > (c2)KMP算法:查询表 > 11c2-3: 实例
由上可见
KMP算法的核心 就在于那张查询表next
在分析这张表的具体原理及其构造过程之前
我们不妨先通过一个实例
来切实领会这张表的精妙之处
考察这个由10个字符所构成的模式串
这里 我们直接给出其对应的查询表
请关注其中倒数第3个字符l
它所对应的秩为j=7
而在查询表中 它所对应的next值为3
下面 我们就来看看这个表项3所对应的含义及其功能
假定这就是主串
如果的确轮到这个表项来发挥作用
那么就意味着在当前这一轮比对中
此前的7个字符都应该是成功的
也就是说 此时的场景必然是这样
具体来说也就是 模式串中的这个字符l与文本串中某个不是l的字符比对失败
此时 针对这种情况
KMP算法将会如何处置呢
为便于对比效果
在处置之前 我们不妨先为模式串拍摄一张快照
就像这样
现在 我们手动来执行一下KMP算法
首先 当前的j为7
指向模式串中的这个字符l
接下来 KMP将在查询表中取出对应的那一项
并用它来更新j
我们刚才已经看到
这个表项就是3
这就意味着 接下来KMP将会用秩为3的那个字符 也就是n
来取代刚才的l
并继续与文本串中此前失配的那个字符对齐
就像这样
此时 我们不妨为模式串再拍摄一张快照
对比前后两张快照
我们会发现 其效果等同于模式串向后移动了4个字符
不难看出
这个4是来自于7和3的差
从另一个角度来看
这也等效于KMP聪明地排除掉了3个不必要的对齐位置
是的 这3个位置都是无需对齐的
因为它们都不具备足以对齐的必要条件
比如 它们所对应的首字符都不是模式串的首字符c
而反过来
KMP通过next表选择了字符n
从某种意义上讲是非常合理的
没错 它使得相对于n而言的这个前缀
依然与主串是匹配的
具体来说 c依然对应于c h依然对应于h 而i也依然对应于i
是的 通过这样一个实例
我们的确已经能够感受到 KMP算法及其中next表的精妙之处
但严格地来说 在这种精妙的背后
究竟是什么样的原理呢
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试