C++ 数据结构之kmp算法中的求Next()函数的算法

C++ 数据结构之kmp算法中的求Next()函数的算法

什么是KMP算法和Next()函数

KMP算法(Knuth-Morris-Pratt算法)是一种字符串匹配算法,能够解决的问题是,在一个文本串S中查找一个模式串P是否出现并且返回第一次出现的位置。而Next()函数则是在KMP算法中使用的一个关键的子函数,用于计算模式串P中每个前缀的最长相同真前缀和后缀的长度,从而实现快速的模式串匹配。

如何求Next()函数

设模式串P的长度为m,对于i=1,2,...,m,我们需要求出P[0:i-1]的最长相同真前缀和后缀的长度,即Next(i)的值。具体的算法如下:

  1. 初始化Next(0)为-1,Next(1)为0。
  2. 对于i=2,3,...,m-1,计算Next(i)。
  3. 如果P[Next(i-1)]等于P[i-1],则Next(i)等于Next(i-1)+1。
  4. 否则,令j=Next(i-1),不断向前递推Next(j),例如,如果P[Next(j)]等于P[i-1],则Next(i)等于Next(j)+1,否则继续递推。当递推到j=-1时,Next(i)等于0。

以上就是Next()函数的求解过程,该算法的时间复杂度为O(m),其中m为模式串的长度。

两条示例说明

示例1

假设模式串P为“abababca”,则P的长度为8,对于i=2,3,...,7,我们依次计算Next(i)的值。

  • i=2,P[0:1]="ab",Next(1)=0。
  • i=3,P[0:2]="aba",Next(2)=0。
  • i=4,P[0:3]="abab",Next(3)=1。
  • i=5,P[0:4]="ababa",Next(4)=2。
  • i=6,P[0:5]="ababab",Next(5)=3。
  • i=7,P[0:6]="abababc",Next(6)=0。

因此,模式串P的Next()函数的值为Next={-1,0,0,1,2,3,0,1}。

示例2

假设模式串P为“abcabcabc”,则P的长度为9,对于i=2,3,...,8,我们依次计算Next(i)的值。

  • i=2,P[0:1]="ab",Next(1)=0。
  • i=3,P[0:2]="abc",Next(2)=0。
  • i=4,P[0:3]="abca",Next(3)=1。
  • i=5,P[0:4]="abcab",Next(4)=2。
  • i=6,P[0:5]="abcabc",Next(5)=3。
  • i=7,P[0:6]="abcabca",Next(6)=4。
  • i=8,P[0:7]="abcabcab",Next(7)=5。

因此,模式串P的Next()函数的值为Next={-1,0,0,1,2,3,4,5}。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 数据结构之kmp算法中的求Next()函数的算法 - Python技术站

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

相关文章

  • C++数据结构AVL树全面分析

    C++数据结构AVL树全面分析 简介 AVL树是一种二叉搜索树,它通过使树保持高度平衡来提高搜索、插入和删除操作的效率。AVL树本质上是通过在插入和删除节点时旋转子树来保持平衡的。AVL树被认为是最早的自平衡二元搜索树。 AVL树的定义 AVL树是一种满足以下特性的BST: 每个节点都有一个左子树和一个右子树,并且左子树、右子树也是AVL树。 左子树高度和右…

    数据结构 2023年5月17日
    00
  • [paper reading]|IC-FPS: Instance-Centroid Faster Point Sampling Module for 3D Point-base

    摘要: 本文说首次实现了大规模点云场景中基于点的模型的实时检测(<30ms); 首先指出FPS采样策略进行下采样是耗时的,尤其当点云增加的时候,计算量和推理时间快速增加; 本文提出IC-FPS;包含两个模块:local feature diffusion based background point filter (LFDBF);Centroid In…

    算法与数据结构 2023年4月17日
    00
  • C语言数据结构旋转链表的实现

    C语言数据结构旋转链表的实现 1. 什么是旋转链表 旋转链表是一种特殊的链表,其特点是将链表的最后一个节点移动到最前面,形成一个环形链表的效果。比如下面这个链表: 1 -> 2 -> 3 -> 4 -> 5 经过一次旋转之后变成了: 5 -> 1 -> 2 -> 3 -> 4 2. 实现思路 旋转链表的实现思路…

    数据结构 2023年5月17日
    00
  • Java数据结构之图的基础概念和数据模型详解

    Java数据结构之图的基础概念和数据模型详解 简介 图是一种非常重要的数据结构,在计算机科学和实际应用中广泛使用。比如搜索引擎中的网页之间的链接关系就可以用图来表示和处理。在本文中,我们将详细讲解图的基础概念和数据模型。同时,我们将通过两个实例来进一步说明图的应用。 图的基础概念 什么是图 图是由若干个节点(顶点)和连接节点的边组成的一种数据结构。一个图可以…

    数据结构 2023年5月17日
    00
  • C#数据结构之堆栈(Stack)实例详解

    C#数据结构之堆栈(Stack)实例详解 在编程中,我们经常需要保存一些数据,这些数据可以根据其进入的先后顺序以及其他规则进行处理和访问。其中,堆栈(Stack)是一种简单但是非常有用的数据结构。本文将为大家详细讲解堆栈(Stack)的概念、用法以及C#中的实现方法。 堆栈(Stack)概述 堆栈(Stack)是一种后进先出(LIFO)的数据结构。也就是说,…

    数据结构 2023年5月17日
    00
  • 一文学会数据结构-堆

    一文学会数据结构-堆 什么是堆 在计算机科学中,堆是一个特殊的树状数据结构。堆通常有如下几个特性: 堆是完全二叉树; 堆中每个节点的值都大于或等于(小于或等于)其子节点的值,这个取值规则称为堆的“属性”; 堆顶元素(即根节点)总是为最大值或最小值。 堆的种类 堆分为小根堆和大根堆两种。小根堆要求每个节点的值都不大于其父节点的值,即A[PARENT[i]] &…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构之栈实例用法

    JavaScript数据结构之栈实例用法 本文将会介绍栈在JavaScript中的实例用法以及栈作为一种数据结构的基本概念。 栈的定义 栈是一种遵从后进先出(LIFO)原则的有序集合。新添加或待删除的元素都保存在栈的同一端,称作栈顶,另一端称作栈底,不含任何元素的栈称为空栈。 栈的应用场景 栈其应用场景是非常广泛的。在现实世界中,许多普通的场景都可以使用栈作…

    数据结构 2023年5月17日
    00
  • C语言数据结构实现银行模拟

    C语言数据结构实现银行模拟攻略 背景介绍 银行模拟是计算机学科中一个重要的数据结构实践练习项目。它涉及到队列(Queue)等数据结构的应用,也是计算机基础课程的一个重要组成部分。 代码实现 1. 队列的实现 首先,我们需要实现一个队列(Queue)结构体,包含 QueueSize、Front、Rear 三个成员变量: struct Queue { int Q…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部