KMP算法详解-next函数数学推导

KMP算法是一种用于字符串模式匹配的高效算法,由Knuth、Morris和Pratt提出。它通过构造next数组避免了BF算法在失配后的无效回溯,从而将时间复杂度降低到O(n+m)。本文详细介绍了KMP算法的思想,next数组的求解过程,以及算法优化的要点。

简介

     KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。主要用于解决字符串模式匹配。

一般的解法-BF算法

BF算法思想

     Brute-Force算法又称做"蛮力匹配"算法,从主串S的第pos个字符开始,和模式串T的第一个字符进行比较,若相等,继续逐个比较后续字符,否则回溯到主串S的pos+1个字符重新和模式串T进行比较。以此轮推,直到匹配成功,或者退出循环匹配失败。

图解

如初始化pos=0,S串和T串如下
在这里插入图片描述
比较i指针指向的字符和j指针指向的字符是否一致。如果一致就都向后移动,如果不一致,如下图:
在这里插入图片描述
A和E不相等,那就把i指针移回第1位(假设下标从0开始),j移动到模式串的第0位,然后又重新开始这个步骤:
在这里插入图片描述
直到匹配成功或退出循环。

程序代码

public static int bf(String S,int pos ,String T) {
   
   
	int i = pos; // 主串的位置
    int j = 0; // 模式串的位置
    while (i < S.length() && j < T.length()) {
   
   
   		if (S.charAt(i) == T.charAt(j)) {
   
    // 当两个字符相同,就比较下一个
            i++;
            j++;
   		} else {
   
   
            i = i - j + 1; // 一旦不匹配,i后退
            j = 0; // j归0
        }
    }
    if (j == T.length()) {
   
   
        return i - j;
    }
    else {
   
   
       return -1;
    }     
}

KMP算法

 

算法引入

     上面的算法思想比较简单,但当在最坏情况时,算法的时间复杂度为O(n*M),其中n,m分别为主串和模拟串的长度,其中主要的时间耗费在失配后的比较位置有回溯,而KMP算法正是对这一问题改进算法,改进后的时间复杂度为O(n+m)。

难点突破

 

移动问题思路分析

    整个KMP的重点就在于当某一个字符与主串不匹配时,我们应该知道j指针要移动到哪?
首先我们来看一下自己发现的j的移动规律:

在这里插入图片描述

如图:C和D不匹配了,我们要把j移动到哪?显然是第1位(所有下标都从0开始,如果觉得绕可理解为i,j不动,移动T数组)。因为前面有一个A相同:
在这里插入图片描述

如下图也是一样的情况:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值