C语言kmp算法简单示例和实现原理探究

yizhihongxing

C语言KMP算法简单示例和实现原理探究

概述

KMP算法是一种字符串匹配算法,它能在O(n+m)的时间复杂度内匹配文本串和模式串。与简单的暴力匹配算法相比,它的时间复杂度更低。

实现原理

暴力匹配算法

在了解KMP算法之前,我们先来看一下暴力匹配算法,这是最简单的字符串匹配算法。

暴力匹配算法的实现原理是:假设文本串为T,模式串为P,从T的第一个字符开始,依次比较T和P的每个字符,如果相同,则接着比较下一个字符,如果不同,则从下一个字符重新开始匹配,直到将整个模式串匹配完为止。

KMP算法

KMP算法是一种比暴力匹配算法更高效的字符串匹配算法。它的核心思想是:当出现不匹配时,尽可能地利用已经匹配过的部分,减少模式串和文本串比较的次数。

计算最长公共前缀和最长公共后缀

KMP算法的第一步是计算出模式串的“最长公共前缀”和“最长公共后缀”。

最长公共前缀指的是,以模式串开头的那部分子串中,既是前缀又是后缀的最长子串。例如,模式串“abab”的最长公共前缀是“ab”。

最长公共后缀指的是,以模式串结尾的那部分子串中,既是前缀又是后缀的最长子串。例如,模式串“abab”的最长公共后缀是“ab”。

计算最长公共前缀和最长公共后缀的方法是,以模式串中每个字符为结尾,找到它前面的子串中既是前缀又是后缀的最大长度。此处使用一个next数组来存储最长公共前缀和最长公共后缀的值。

KMP算法实现流程

有了最长公共前缀和最长公共后缀的值之后,就可以开始实现KMP算法了。KMP算法的实现流程如下:

  • 从文本串T的第一个字符开始匹配模式串P的第一个字符。
  • 如果两个字符相等,则继续比较下一个字符。
  • 如果两个字符不相等,则根据next数组移动模式串。
  • 重复步骤2和步骤3,直到找到匹配或者文本串匹配完为止。

KMP算法的关键在于如何根据next数组移动模式串。

假设文本串T的当前位置是i,模式串P的当前位置是j,出现不匹配时,模式串需要移动的距离是k = j - next[j]。移动模式串的时候,需要将模式串的前k个字符跳过,从第k+1个字符开始继续比较。

关于next数组的计算

next数组的第一个元素next[0]必须是-1,表示移动模式串到第一个字符之前。next数组的其他元素计算方法如下:

  • next[0] = -1
  • 如果模式串的前j个字符(不包括第j个字符)与模式串的前k个字符(不包括第k个字符)匹配,则next[j] = k。
  • 如果模式串的前j个字符(不包括第j个字符)与模式串前缀的一个子串匹配,则递归地寻找匹配的最大长度,即next[k]。

示例

示例1

有一个文本串T:“ABCDABD”,和一个模式串P:“ABD”。

模式串P和文本串T的匹配过程如下:

  1. T[1]和P[1]相等,继续比较下一个字符;
  2. T[2]和P[2]相等,继续比较下一个字符;
  3. T[3]和P[3]不相等,根据next数组将P向右移动2个字符(即跳过AB),改成在T[3]和P[1]比较。
  4. T[3]和P[1]不相等,继续向右移动模式串,变成在T[3]和P[0]比较(即P前面加一个未匹配的字符)。
  5. T[3]和P[0]不相等,因为next[0]=-1,所以将模式串P向右移动1个字符;
  6. 继续比较T[3]和P[1],相等,继续比较下一个字符;
  7. T[4]和P[2]相等,继续比较下一个字符;
  8. T[5]和P[3]相等,完成匹配。

示例2

有一个文本串T:“ACABAABAACACAADABAA”,和一个模式串P:“AABAAC”。

模式串P和文本串T的匹配过程如下:

  1. T[1]和P[1]相等,继续比较下一个字符;
  2. T[2]和P[2]相等,继续比较下一个字符;
  3. T[3]和P[3]不相等,根据next数组将P向右移动3个字符(即跳过AAB),改成在T[3]和P[1]比较。
  4. T[3]和P[1]不相等,继续向右移动模式串,变成在T[3]和P[0]比较(即P前面加一个未匹配的字符)。
  5. T[3]和P[0]不相等,因为next[0]=-1,所以将模式串P向右移动1个字符;
  6. 继续比较T[3]和P[1],相等,继续比较下一个字符;
  7. T[4]和P[2]相等,继续比较下一个字符;
  8. T[5]和P[3]相等,继续比较下一个字符;
  9. T[6]和P[4]相等,继续比较下一个字符;
  10. T[7]和P[5]相等,完成匹配。

总结

KMP算法是一种高效的字符串匹配算法。通过计算模式串的最长公共前缀和最长公共后缀,可以减少模式串和文本串比较的次数,提高匹配效率。在实际开发中,可以使用KMP算法来实现字符串匹配功能,例如搜索引擎中的关键字查询等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言kmp算法简单示例和实现原理探究 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • 关于vector的常见用法详解

    关于vector的常见用法详解 简介 C++ STL提供了许多数据结构,其中vector是其中一个常用的容器。vector是一个动态可变数组,其大小可以在运行时改变。其背后实现的机制是使用数组来实现,同时使用一个整数来记录当前的容器大小。 常见用法 创建vector 我们可以使用以下方式来创建一个vector容器: #include <vector&g…

    C 2023年5月22日
    00
  • golang分层测试之http接口测试入门教程

    我来详细讲解“golang分层测试之http接口测试入门教程”的完整攻略。该攻略包括以下几个部分: 1.前置知识 在学习golang分层测试之http接口测试之前,需要掌握一些基础知识,包括但不限于: Golang基础语法 RESTful API基本概念 Http协议 JSON数据格式 2.环境搭建 在进行http接口测试之前,需要搭建一套测试环境。可以从以…

    C 2023年5月23日
    00
  • 解决vscode下调试c/c++程序一闪而过的问题(Windows)

    下面我将为您详细讲解“解决vscode下调试c/c++程序一闪而过的问题(Windows)”的完整攻略。 问题描述 在使用 Visual Studio Code 进行 C/C++ 的 debug 时,调试控制台会一下子出现,一下子消失,导致无法查看输出结果。这是因为控制台程序执行完成后就立刻退出了,而调试控制台会立刻关闭。这个问题可以通过添加一个 syste…

    C 2023年5月23日
    00
  • C#实现生成所有不重复的组合功能示例

    生成所有不重复的组合是一项常见的算法问题,可以使用C#编程语言轻松实现。下面是一个完整的攻略: 1. 程序实现思路 生成所有不重复的组合功能的实现思路如下: 创建一个长度为n的数组,数组中存储n个不同的元素。 从数组中选出其中的k个元素,形成一个组合。 从数组中选取下一个元素,生成下一个组合。 重复上述步骤,直到所有组合都被生成。 2. 实现代码 下面是使用…

    C 2023年5月22日
    00
  • excel表格常用函数技巧大全 excel中最常用的30个函数分享

    “Excel表格常用函数技巧大全 Excel中最常用的30个函数分享”是一个非常实用的指南,能够帮助用户掌握Excel中最常用的函数,提高Excel表格的使用效率。以下是该攻略的详细讲解: 概述 本攻略介绍Excel中最常用的30个函数,包含函数的语法、用途及示例等方面的详细解释,旨在提高用户对Excel函数的认识,提高表格的使用效率。 函数分类 本攻略将这…

    C 2023年5月22日
    00
  • 详解json string转换为java bean及实例代码

    下面是“详解json string转换为java bean及实例代码”的完整攻略: 什么是JSON JSON是一种轻量级的数据交换格式,具有易读易写、占用带宽小、易解析和支持多种语言等优点。在Web开发中,常用于数据传输和Web API。 JSON to Java Bean 转换 在Java中,我们可以通过JSON的转换将JSON字符串转换成Java Bea…

    C 2023年5月23日
    00
  • C# 中如何使用Thread

    在C#中,我们可以使用Thread类来实现多线程编程。下面是使用Thread类来创建线程的详细攻略: 创建线程 要使用Thread实现线程,首先需要创建一个Thread对象,包含线程要执行的方法。 Thread thread = new Thread(new ThreadStart(ThreadMethod)); 此处ThreadMethod代表线程要执行的…

    C 2023年5月22日
    00
  • C 和 Dart 的区别

    C 和 Dart 是两种不同的编程语言,它们各自有着不同的特点和用途。在这里,我将详细讲解 C 和 Dart 的区别及其使用攻略。 C 和 Dart 的基本介绍 C 语言 C 语言是一种广泛使用的高级程序设计语言,具有高效、简洁、快速和可移植等特点。C 语言可以用来开发操作系统、编写驱动程序、实现嵌入式系统和游戏引擎等需求。 Dart 语言 Dart 语言是…

    C 2023年5月10日
    00
合作推广
合作推广
分享本页
返回顶部