KMP算法的分析及实现(C语言)

一、算法简介

  KMP算法是由D.E.Knuth、J.HMorris和V.R.Pratt(其中Knuth和Pratt共同研究,Morris独立研究)发表的一个模式匹配算法,称为克努特——莫里斯——普拉特算法,简称KMP算法。该算法主要解决字符串匹配时,重复遍历的问题。和传统依次遍历的算法相比,KMP算法更适合于主串与字串之间存在许多部分匹配的情况,否则无法体现出该算法的优势。

二、算法原理

1、算法实现过程简介

  算法中用到一个主字符串和一个子字符串,分别简称为 “主串” 和 “字串”,具体的功能是在主串中找到和子串匹配(相等)的连续的字符串,然后根据不同的需求进行相应的操作。
  普通的字符串匹配时,选定好主串和子串中的起始位置下标,然后依次判断是否主串和子串的字符是否相等,如果出现不相等的字符,则确认本次匹配失败,结束本次匹配;如果一直判断直到最后两个字符相等,则本次匹配成功。如果匹配的结果为失败,则需要重新开始下一次的匹配,此时主串的下标需要退回到上一次的起始下标之后,子串的位置下标退回到子串的起始位置,重复上述匹配过程,直到成功匹配或者遍历完整个主串。
  KMP进行字符串匹配时,首先选定主串和子串的起始位置下标,下标同时依次进行遍历比较,如果一直相等直到子串结束,则本次匹配成功;如果本次匹配失败,则主串的位置下标不用退回,保持在匹配失败的位置,子串的位置下标退回到 next 数组中存储的位置处,开始下一次的匹配,直到整个主串遍历完成或者成功匹配。
  在普通字符串匹配的过程中,每开始一次匹配,主串和子串的下标都需要退回至一定的位置。KMP进行字符串匹配时,每开始一次匹配,主串的当前位置下标不用退回,子串的当前位置下标也不用退回至起始位置,而是退回至 next 数组中的指定位置

2、next 数组

2.1、简介

  nest 数组的长度和子串的长度一致,存放的是子串的当前位置下标需要退回的位置。给定一个字符串 “ababaaaba”,它对应的 next 数组中的值是{0 1 1 2 3 4 2 2 3},假定 next 数组的下标从 1 开始,则 next[7]==2,表示如果出现了主串和子串元素不匹配的情况,子串从 2 的位置重新开始比较即可,不用从 1 的位置开始。

2.2、公式

{ 0 , 当 j = 1 时 M a x { k ∣ 1 < k < j , 且 ′ P 1 . . . P k − 1 ′ = ′ P j − k + 1... P j − 1 ′ } 1 , 其 它 情 况 \left\{ \begin{matrix} 0,当 j = 1时 \\ Max\left\{k|1<k<j,且'P_1...P_k-1'='P_j-k+1...P_j-1' \right\} \\ 1,其它情况 \\ \end{matrix} \right.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值