KMP

简介: 【7月更文挑战第7天】

KMP算法,全称Knuth-Morris-Pratt字符串搜索算法,是一种高效的字符串搜索(或模式匹配)算法。它由Donald Knuth、Vaughan Pratt和James H. Morris共同发明,能够快速地在一个文本串(text)中查找一个模式串(pattern),特别是在模式串较长或在一个文本串中多次查找时。

KMP算法的特点:

  1. 单次预处理:KMP算法首先对模式串进行一次预处理,构建一个部分匹配表(也称为"前缀函数"或"失配表"),用于在搜索过程中遇到不匹配的情况时确定下一步的搜索位置。
  2. 线性时间复杂度:在最坏的情况下,KMP算法的时间复杂度为O(n+m),其中n是文本串的长度,m是模式串的长度。
  3. 无回溯:与简单的回溯字符串搜索算法(如朴素算法)不同,KMP算法不会在文本串中来回移动,因此效率更高。

KMP算法的基本步骤:

  1. 预处理模式串:构建部分匹配表。
  2. 搜索:使用部分匹配表在文本串中搜索模式串。

代码使用示例:

以下是KMP算法的一个简单Python实现:

def kmp_search(text, pattern):
    # 预处理模式串,构建部分匹配表
    def compute_lps(pattern):
        length = 0  # length of the previous longest prefix suffix
        lps = [0] * len(pattern)  # lps[0] is always 0
        i = 1
        while i < len(pattern):
            if pattern[i] == pattern[length]:
                length += 1
                lps[i] = length
                i += 1
            else:
                if length != 0:
                    length = lps[length - 1]
                else:
                    lps[i] = 0
                    i += 1
        return lps

    lps = compute_lps(pattern)
    i = j = 0  # i是text的索引,j是pattern的索引
    while i < len(text):
        if pattern[j] == text[i]:
            i += 1
            j += 1
        if j == len(pattern):
            print(f"Pattern found at index {i - j}")
            j = lps[j - 1]  # 继续搜索下一次出现
        elif i < len(text) and pattern[j] != text[i]:
            if j != 0:
                j = lps[j - 1]  # 根据部分匹配表移动j
            else:
                i += 1

# 示例使用
text = "ABABDABACDABABCABAB"
pattern = "ABABCABAB"
kmp_search(text, pattern)
目录
相关文章
|
12月前
|
算法 JavaScript 测试技术
较难理解的字符串查找算法KMP
较难理解的字符串查找算法KMP
|
算法
大话 KMP 算法
大话 KMP 算法
55 1
|
5月前
|
算法
|
5月前
KMP算next数组(2023 _ 7 _ 23 )笔记
KMP算next数组(2023 _ 7 _ 23 )笔记
38 0
|
存储 算法 C语言
KMP 字符串匹配算法
✅<1>主页:C语言的前男友 📃<2>知识讲解:KMP算法 🔥<3>创作者:C语言的前男友 ☂️<4>开发环境:Visual Studio 2022 🏡<5>系统环境:Windows 10 💬<6>前言:KMP 算法是一个非常牛逼的字符串匹配算法
|
存储 算法 搜索推荐
KMP 算法(Knuth-Morris-Pratt)
KMP算法,全称为Knuth-Morris-Pratt算法,是一种字符串匹配算法。它的基本思想是,当出现字符串不匹配时,可以知道一部分文本内容是一定匹配的,可以利用这些信息避免重新匹配已经匹配过的文本。这种算法的时间复杂度为O(n+m),其中n是文本串的长度,m是模式串的长度,比暴力匹配算法具有更高的效率。KMP算法的核心是利用模式串本身的特点,预处理出一个next数组,用于在匹配过程中快速移动模式串。
628 0
KMP 算法(Knuth-Morris-Pratt)
|
存储 算法
理解KMP
理解KMP
69 0
KMP - leetcode28. 实现 strStr()
快速学习 KMP - leetcode28. 实现 strStr()
KMP - leetcode28. 实现 strStr()
|
算法
KMP 算法的理解
KMP 算法的理解关于字符串的子串模式匹配算法,最经典最简单的的算法是BP算法(Brude-Force)。
77 0
KMP 算法的理解