数据结构(C语言版)严蔚敏(字符串的模式匹配算法–KMP算法)

1.暴力匹配算法

// 暴力匹配算法
int Index2(SString S,SString T)
{// S是主串,T是子串int i=0,j=0;while(i<S.length&&j<T.length){if(S.ch[i]==T.ch[j]){i++;j++;}else{i=i-j+1;j=0;}}if(j>=T.length)return i-T.length+1;elsereturn 0;
}

运行结果:

最坏时间复杂度为:O(nm),其中n和m分别代表主串和模式串的长度。

2.KMP算法

KMP算法(用空间来换时间,需要提前计算子串部分匹配值)
1.字符串的前缀、后缀和部分匹配值
前缀指除最后一个字符以外,字符串的所有头部子串;后缀指除第一个字符外,字符串的所有尾部子串;部分匹配值则是字符串的前缀和后缀的最长且相等前后缀长度。


如子串"ababa""a"的前缀和后缀都为空,最长相等前后缀长度为0
"ab"的前缀{"a"},后缀为{"b"},最长相等前后缀长度为0
"aba"的前缀{"a","ab"},后缀为{"ba","a"},最长相等前后缀长度为1
"abab"的前缀{"a","ab","aba"},后缀为{"bab","ab","b"},最长相等前后缀的长度为2
"ababa"的前缀{"a","ab","aba","abab"},后缀为{"baba","aba","ba","a"},最长相等前后缀的长度为3

字符串”ababa“的部分匹配值为00123

用同样的方式可以得到字符串”abcac“的部分匹配值为:00010

编号 1 2 3 4 5
s a b c a c
PM 0 0 0 1 0

PM表
用PM表来进行字符串匹配
移动位数=已匹配的字符数-对应的部分匹配值

1
主串 a b a b c a b c a c
子串 a b c
第1次匹配‘a’与‘c’不等,查PM表可知最后一个字符‘b’对应的部分匹配值为0,子串移动位数为:2
2
主串 a b a b c a b c a c
子串     a b c a c
第2次匹配‘b’与‘c’不等,查PM表可知最后一个字符‘a’对应的部分匹配值为1,子串移动位数为:4-1=3
3
主串 a b a b c a b c a c
子串           a b c a c
匹配成功!

KMP算法时间复杂度为O(n+m)
KMP算法的改进
移动位数=已匹配的字符数-对应的部分匹配值
如果用j表示子串的字符下标,则上述公式可以写成Move=(j-1)-PM[j-1]
使用部分匹配值时,每当碰到匹配失败时,都需要去找它前一个元素的部分匹配值,为了方便,改进PM表如下:

编号 1 2 3 4 5
s a b c a c
next -1 0 0 0 1

上述公式可以写成:Move=(j-1)-next[j]
相当于子串的比较指针j回退到 j=j-Move=next[j]+1
于是,上述next数组进一步可以表示为:

编号 1 2 3 4 5
s a b c a c
next 0 1 1 1 2

最终得到子串指针变化公式为j = next[j]
next[j]的含义:在子串的第j个字符与主串发生失配时,则跳到子串的next[j]位置重新与主串当前位置进行比较。
参考代码如下:

void get_next(SString T,int next[]){int i=1,j=0;next[1] = 0;while(i<T.length){if(j==0 || T.ch[i-1] == T.ch[j-1]){i++;j++;next[i] = j;}elsej = next[j];}
}int Index_KMP(SString S,SString T,int next[]){int i=1,j=1;while(i<=S.length&&j<=T.length){if(j==0||S.ch[i-1]==T.ch[j-1]){i++;j++;}elsej = next[j];}if(j>T.length)return i-T.length;elsereturn 0;
}

第一个函数用于求next数组,第二个函数就是KMP匹配算法,运行结果同上。

数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)相关推荐

  1. c语言实现bf算法的定位函数,数据结构c语言版严蔚敏清华大学出版社第四章串.ppt...

    数据结构c语言版严蔚敏清华大学出版社第四章串 模式匹配(定位) 设有主串S和子串T(将S称为目标串,将T称为模式串),在主串S中,从位置start开始查找,如若在主串S中找到一个与子串T相等的子串,则 ...

  2. 数据结构(C语言版)严蔚敏(树、二叉树的相关概念笔记)

    数据结构(C语言版)严蔚敏(树的相关概念笔记) 1. 树中一个节点的孩子个数称为该节点的度,树中节点的最大度数称为树的度: 2. 度大于0的节点称为[分支节点](非终端节点),度为0的节点称为[叶子节 ...

  3. 数据结构(C语言版)严蔚敏---图的操作的相关代码

    1. 将邻接表转换成邻接矩阵 main.cpp void Convert(ALGraph G,MGraph &M){M.vexnum = G.vexnum;M.arcnum = G.arcnu ...

  4. 数据结构(C语言版 严蔚敏著)——树

    · 树(tree)是n(n>=0)个结点的有限集.当n=0时成为空树,在任意一颗非空树中: //这里只需掌握定义,重点在二叉树 -有且仅有一个特定的称为根(Root)的结点: -当n>1时 ...

  5. 数据结构c语言版严蔚敏 顺序表

    说来惭愧由于贪玩,数据结构挂科了,现在重新学一遍数据结构,用博客督促一下自己,希望各位同学引以为戒,贪玩一时爽,痛苦永留存. 本文主要以严老师的数据结构书为主. 结构类型 listsize代表这个顺序 ...

  6. 数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序、中序、后序、层次)和线索二叉树

    二叉树每个节点至多只有两棵子树(即二叉树中不存在度大于2的节点),并且二叉树的子树有左右之分,其次序不能任意颠倒. 1. 二叉树 二叉树一般采用链式存储结构,用链表节点来存储二叉树中每个节点.在二叉树 ...

  7. 数据结构(C语言版)严蔚敏->排序

    排序 1. 插入排序 1.1 直接插入排序 1.2 折半插入排序 1.3 希尔排序(Shell Sort) 2.交换排序 2.1 冒泡排序 2.2 快速排序 3. 选择排序 3.1 简单选择排序 3. ...

  8. [数据结构]模式匹配算法--KMP算法详解

    目录 一. 模式匹配 二. 模式匹配算法 1. 朴素模式匹配算法 2. KMP算法 1). KMP算法的优势 2). KMP算法的原理 3). next数组的构造 4). 利用next数组匹配的过程 ...

  9. 数据结构(C语言版 严蔚敏 编著)课后习题答案

    转自 https://blog.csdn.net/Bamboo_shui/article/details/72433523    (原文没第八章答案) 数据结构(C语言版 第2版)课后习题答案 严蔚敏 ...

最新文章

  1. ubuntu系统安装mysql二进制压缩包(tar.gz)以及navicat远程连接服务器(linux系统)
  2. Windbg中使用查找内存并设置访问断点
  3. Mysql访问新数据时先查表
  4. Redis Master/Slave 实践
  5. 【转】软件需求分析方法
  6. 葫芦岛市一高中2021年高考成绩查询表,2021年葫芦岛高考状元多少分是谁,葫芦岛高考状元名单资料...
  7. linux mysql5.7.11_在Linux中以命令行方式安装 MySQL 5.7.11 for Linux Generic 二进制版本
  8. 首届渣打科营编程马拉松赛初赛圆满结束
  9. hive mysql互导_Hive和MySQL数据互导
  10. Android知识散点
  11. Synopsys MetaWare for Linux 安装与编译指南
  12. 拓端tecdat|R语言空间可视化:绘制英国脱欧投票地图
  13. mac传输文件之airdrop
  14. Linux服务器清理磁盘
  15. 知物由学 | 用案例起底黑灰产的各种“骚”操作
  16. 大前端-HTML-标签
  17. OpenDDS制作编译idl文件之一
  18. JNA 中 GetProcAddress(HMODULE hmodule, int ordinal) 的正确使用方式。LoadLibrary
  19. 目前是大专学历如何快速提升到本科学历?学历提升有哪几种形式呢?
  20. 5G 与 MEC 边缘计算

热门文章

  1. CocosCreator优化之DrawCall漫谈
  2. 科技科幻风格的RPG像素游戏室内地图素材包
  3. 预测性维护_工厂数据的预测性维护
  4. 附上windebug常用调试命令
  5. 34所985计算机考研难度,34所自划线院校考研难度排行,你关注哪档?
  6. 【Vue】 组件封装
  7. 让当前网页完全包含另一个页面
  8. 报名 | 2022年 Ansys 全球仿真大会中国站启动报名
  9. NYOJ 253LK的旅行(凸包 对踵点)
  10. 2013-12-IOS 获取最新设备型号方法