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日

相关文章

  • PAT甲级真题1020.树的遍历

    翻译和代码思路:Acwing 一个二叉树,树中每个节点的权值互不相同。 现在给出它的后序遍历和中序遍历,请你输出它的层序遍历。 输入格式 第一行包含整数 N,表示二叉树的节点数。 第二行包含 N个整数,表示二叉树的后序遍历。 第三行包含 N 个整数,表示二叉树的中序遍历。 输出格式 输出一行 N个整数,表示二叉树的层序遍历。 数据范围 1<=N<…

    算法与数据结构 2023年4月17日
    00
  • 1811 E Living Sequence 两种解法

    思维 进制转换 数位DP 无前导0 T3Problem – 1811E – Codeforces 题目大意 从一个不含有数字4的递增序列中找第k个数并输出。如 \(1,2,3,5,6,7,8,9,10,11,12\), \(k = 4\) 时输出 \(5\)。 思路1 有一个巧妙的解法:考虑这个问题, 从一个没有限制的从1开始的递增序列找出第k个数, 显然就…

    算法与数据结构 2023年4月17日
    00
  • C语言实现数据结构迷宫实验

    C语言实现数据结构迷宫实验攻略 简介 迷宫是计算机图形学中的一个经典问题,也是数据结构和算法中常见的题目。C语言是一种广泛使用的编程语言,具有充分的编程接口和功能,可以方便地实现迷宫算法和数据结构。 本文将详细讲解C语言实现数据结构迷宫实验的完整攻略,让读者能够更加深入地理解迷宫算法和数据结构的应用。 实现步骤 1. 创建迷宫结构体 首先需要创建一个迷宫结构…

    数据结构 2023年5月17日
    00
  • Java数据结构之稀疏数组的实现与应用

    Java数据结构之稀疏数组的实现与应用 什么是稀疏数组 稀疏数组是一种刻画二维数组中许多元素值都为0的特殊数据结构。它可以提高存储空间的利用率,实现对数据的压缩和优化,减少不必要的处理,提升程序的运行效率。 在稀疏数组中,只有非零元素被存储,而这些元素的索引信息和具体数值的信息都会被记录下来。 稀疏数组的实现与应用 实现步骤 创建原始的二维数组,存入多个元素…

    数据结构 2023年5月17日
    00
  • C++数据结构与算法的基础知识和经典算法汇总

    C++数据结构与算法的基础知识和经典算法汇总 1. 基础知识 1.1 数据结构 数据结构是计算机存储、组织数据的方式。这里列出常见的数据结构,包括但不限于: 数组 链表 栈 队列 树 哈希表 1.2 算法 算法是解决问题的步骤和方法。下列是常见的算法: 排序算法 查找算法 字符串算法 图算法 1.3 复杂度 复杂度是算法性能的度量。常见的复杂度表示法有O(n…

    数据结构 2023年5月17日
    00
  • 四边形不等式学习笔记

    简要题意 四边形不等式是一种 dp 优化策略。多用于 2D DP。 内容 对于区间 \([l,r]\) 带来的贡献 \(w(l,r)\),如果其满足: 对于 \(L\leq l\leq r \leq R\),\(w(L,r)+w(l,R)\leq w(L,R)+w(l,r)\) 则称 \(w\) 满足四边形不等式。特别地,如果上式符号取等,则称其满足四边形恒…

    算法与数据结构 2023年4月17日
    00
  • Java 数据结构算法Collection接口迭代器示例详解

    Java 数据结构算法 Collection 接口迭代器示例详解 如果你正在学习 Java 编程,那么数据结构和算法一定是一个不可避免的话题。在 Java 中,Collection 框架提供了许多有用的接口和类来管理和操作集合。其中,迭代器 Iterator 是 Collection 中最重要的接口之一,它提供了对集合元素进行迭代的方法。本文将对 Java …

    数据结构 2023年5月17日
    00
  • 带你了解Java数据结构和算法之哈希表

    带你了解Java数据结构和算法之哈希表 前言 哈希表是一种常用的数据结构,它可以高效地存储和查询数据。在计算机科学领域,哈希表广泛用于实现关联数组(Associative Array)和哈希集合(Hash Set)。本文将带领大家深入了解哈希表数据结构及常用算法实现。 哈希表的原理 哈希表是根据关键码值(Key Value)而直接进行访问的数据结构。也就是说…

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